1、
包、过程、函数、触发器练习
1.简述存储过程和函数的区别。
答:相同点:函数和存储过程的输入参数以及函数的返回参数的定义都不能定义精度;默认的参数模式是输入。
不同点:存储过程作为PL/SQL语句块来执行,用输出参数返回值,可以返回任何值。
函数作为表达式的一部分调用,用返回语句返回值,必须包含至少一条return,必须返回单个值。
2.编写一个函数以检查所指定雇员的薪水是否在有效范围内。不同职位的薪水范围为:
Designation Raise
Clerk 1500-2500
Salesman
2、2501-3500
Analyst 3501-4500
Others 4501 and above.
如果薪水在此范围内,则显示消息"Salary is OK",否则,更新薪水为该范围内的最小薪水值。
3.编写一个函数,判断给定的日期所在月份的天数
create or replace function fun(n in date)
return number
is
result number;
begin
select to_number(to_char(last_day(n),'dd')) into re
3、sult from dual;
return result;
end fun;
declare
a number;
begin
a:=fun(to_date('2010-02-01','yyyy-mm-dd'));
dbms_output.put_line('给定日期所在月份的天数是:'||a||'天');
end;
declare
a number;
begin
a:=fun(date'2010-02-01');
dbms_output.put_line('给定日期所在月份的天数是:'||a||'天');
end;
select fun
4、to_date('2000-02-01','yyyy-mm-dd')) from dual;
select fun(date'2000-02-01') from dual;
4、编写存储过程,显示各个职位(job),工资在2000元以上人数和1000元以下人数。
5、创建一个过程,打印出各个工资级别的人数。备注:显示的格式为三种情况1、工资少于2000的人数为:***;工资在2000——3000的人数为****;工资大于3000的人数为:*****
create or replace procedure pro1
is
num1 numb
5、er;
num2 number;
num3 number;
begin
select count(*) into num1 from emp where sal<2000;
select count(*) into num2 from emp where sal between 2000 and 3000;
select count(*) into num3 from emp where sal>3000;
dbms_output.put_line('工资少于2000的人数为:'||num1||'个');
dbms_output.put_line('工资在2
6、000—3000的人数为:'||num2||'个');
dbms_output.put_line('工资大于3000的人数为:'||num3||'个');
end pro1;
6、创建一个表salary_change_record(empid,old_salary,new_salary,change_date),old_salary:用来纪录员工原来的工资,new_salary:用来纪录更新后的工资,change_date:记录更新的系统时间。然后创建一个触发器,名称为 change_record,功能:每次更新员工工资之后,将更新纪录保存到表salary_change_reco
7、rd中。
7、编写一个数据包,它有两个函数和两个过程以操作"emp"表。该数据包要执行的任务为:插入一个新雇员;删除一个现有雇员;显示指定雇员的整体薪水;显示指定雇员所在部门名称。
8、编写一个触发器实现如下功能:
对修改职工薪金的操作进行合法性检查:
a) 修改后的薪金要大于修改前的薪金
b) 工资增量不能超过原工资的10%
c) 目前没有单位的职工不能涨工资
9、控制数据安全性: 例如:限制system用户在正常工作时间(9:00-17:00)改变emp表数据
10、建立视图v_dept_emp,显示员工编号、员工姓名、员工所在部门的编号和部门名称
然后建立instesd of触发器,通过该触发器在视图v_dept_emp上插入数据