龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 数据库类 > Oracle 技术 >

oracle复习笔记之PL/SQL程序所要了解的知识点(5)

时间:2014-08-23 11:24来源:网络整理 作者:网络 点击:
分享到:
定义一个存储过程: 获取给定部门的工资总和(通过out参数),要求部门号和工资总额定义为参数。 (注意:存储过程和存储函数是不一样的,存储函数


定义一个存储过程:获取给定部门的工资总和(通过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

精彩图集

赞助商链接