oracle复习笔记之PL/SQL程序所要了解的知识点(5)
定义一个存储过程:获取给定部门的工资总和(通过out参数),要求部门号和工资总额定义为参数。
(注意:存储过程和存储函数是不一样的,存储函数有返回值而存储过程没有,调用时候存储过程直接调用)
create or replace procedure get_sal1(dept_id number,sumsal out number) is cursor salary_cursor is select salary from employees where department_id = dept_id; begin sumsal := 0; for c in salary_cursor loop sumsal := sumsal + c.salary; end loop; dbms_output.put_line(sumsal); end; 调用: declare v_sal number(10):=0; begin get_sal1(80,v_sal); end;
对给定部门(作为输入参数)的员工进行加薪操作,若其到公司的时间在(?,95)期间,为其加薪5%
(95,98) 3%
(98,?) 1%
得到以下返回结果:为此次加薪公司每月额外付出多少成三(定义一个OUT型的输出参数)
create or replace procedure add_sal(dept_id number,temp out number) is cursor sal_cursor is select employee_id,salary,hire_date from employees where department_id = dept_id; v_temp number(4,2):=0; begin temp := 0; for c in sal_cursor loop if to_char(c.hire_date,'yyyy') < '1995' then v_temp:=0.05; elsif to_char(c.hire_date,'yyyy') < '1998' then v_temp:=0.03; else v_temp:=0.01; end if; update employees set salary = salary * (1+v_temp) where employee_id = c.employee_id; temp := temp + c.salary*v_temp; end loop; dbms_output.put_line(temp); end; 调用: declare v_i number(10):=0; begin add_sal(80,v_i); end;
触发器:
触发事件:在INSERT,UPDATE,DELETE情况下会触发TRIGGER
触发时间:该TRIGGER是在触发事件发生之前(BEFORE)还是之后(AFTER)
触发器本身:该TRIGGER被触发之后的目的和意图,正是触发器本身要做的事情,如PL/SQL块
触发频率:有语句级(STATEMENT)触发器和行级(ROW)触发器
写一个简单的触发器:
create or replace trigger update_emp_trigger after update on employees for each row (行级触发器,即每更新一条记录就会输出一次'helloworld',若没有这语句则是语句级触发器) begin dbms_output.put_line('helloworld'); end;
使用:new,:old修饰符:
1、 create table emp1 as select employee_id,salary,email from employees where department_id = 80; 2、 create or replace trigger update_emp_trigger2 after update on emp1 for each row begin dbms_output.put_line('old salary:'||:old.salary||'new salary:'||:new.salary); end; 3、 update emp1 set salary = salary + 100 ;
编写一个触发器,在对my_emp记录进行删除的时候,在my_emp_bak表中备份对应的记录
1、创建my_emp表: create table my_emp as select employee_id,salary from employees ; 2、创建my_emp_bak表: create table my_emp_bak as select employee_id,salary from employees where 1=2; 3、检查创建的表中的记录: select * from my_emp select * from my_emp_bak 4、创建一个触发器: create or replace trigger delete_emp_trigger before delete on my_emp for each row begin insert into my_emp_bak values(:old.employee_id,:old.salary); end; 5、执行含有触发器时间的语句: delete from my_emp 6、检查触发器执行后的结果: select * from my_emp select * from my_emp_bak