锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

pl/sql编程(五)触发器

时间:2022-09-11 22:00:00 gymb光纤连接器

             触发器
触发器(trigger)是一些过程,与表关系密切,用于保护表中的数据,当一个基表被修改(INSERT、UPDATE或DELETE)时,触发器自动执行,例如通过触发器可实现多个表间数据的一致性和完整性。触发器和应用程序无关。
触发器的类型有三种:
(1)DML触发器。Oracle可以在DML(数据操纵语句)语句进行触发,可以在DML操作前或操作后进行触发,并且可以在每个行或该语句操作上进行触发。
(2)替代触发器。由于在Oracle中不能直接对有两个以上的表建立的视图进行操作,所以给出了替代触发器。它是Oracle专门为进行视图操作的一种处理方法。
(3)系统触发器。在Oracle8i时,提供了第三种类型的触发器叫系统触发器。它可以在Oracle数据库系统的时间中进行触发,如Oracle数据库的关闭或打开等。
创建触发器有以下限制:
(1)代码大小。触发器代码大小必须小于32K。
(2)触发器中有效语句可以包括DML语句,但不能包括DDL语句。ROLLBACK、COMMIT、SAVEPOINT也不能使用。
(3)LONG、LONG RAW和LOB的限制:
①   不能插入数据到LONG或LONG RAW;
②   来自LONG或LONG RAW的数据可以转换成字符型(如char、varchar2),但是不能超过32K;
③   使用LONG或LONG RAW不能声明变量;
④   在LONG或LONG RAW列中不能使用:NEW和:PARENT;
⑤   在LOB中的:NEW变量不能修改。
每张基表最多可
建立12个触发器,它们是:
(1)   BEFORE INSERT;
(2)   BEFORE INSERT FOR EACH ROW;
(3)   AFTER INSERT;
(4)   AFTER INSERT FOR EACH ROW;
(5)   BEFORE UPDATE;
(6)   BEFORE UPDATE FOR EACH ROW;
(7)   AFTER UPDATE;
(8)   AFTER UPDATE FOR EACH ROW;
(9)   BEFORE DELETE;
(10) BEFORE DELETE FOREACH ROW;
(11) AFTER DELETE;
(12) AFTER DELETE FOREACH ROW。

例如:做一个触发器,当删除dept表中部门时,将emp表中该部门人员信息清空;
create or replace trigger emp_dept
  after delete  on   dept
  for each row
declare
  
begin
delete from emp where emp.deptno=:old.deptno;
--表示删除或者修改前该记录旧的数据;
end emp_dept;
 
 例如:修改上题,要求将删除的dept和emp表数据备份到指定表 deptOld和empOld表结构和dept、emp结构一致;
 create or replace trigger emp_dept
  after delete  on   dept
  for each row
declare
   cursor cur is select * from emp where emp.deptno=:old.deptno;
   e emp%rowtype;
   department dept%rowtype;
  
begin
    delete from emp where emp.deptno=:old.deptno;
    if sql%found then
       open cur;
       loop
            fetch  cur into e;
              insert into empOld values(e.empno,e.ename,e.job,e.job,e.mgr,e.hiredate,e.sal,e.comm,e.deptno);
         exit when cur%notfound;
       end loop;
    end if;
           insert into deptOld values(:old.deptno,:old.dname,:old.loc);
end emp_dept;


锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章