示例18 行级、语句级和INSTEAD OF触发器

来源:互联网 发布:2016淘宝开店得多少钱 编辑:程序博客网 时间:2024/06/05 14:15
/*============================================================
                       示例 行级触发器
  ============================================================*/

CREATE OR REPLACE TRIGGER aiud_emp_row
AFTER INSERT OR UPDATE OR DELETE
ON emp
FOR EACH ROW
BEGIN
  IF UPDATING THEN
    DBMS_OUTPUT.PUT_LINE('ORDER_MASTER 中的数据已更新');
  ELSIF DELETING THEN
    DBMS_OUTPUT.PUT_LINE('ORDER_MASTER 中的数据已删除');
  ELSIF INSERTING THEN
    DBMS_OUTPUT.PUT_LINE('数据已插入 ORDER_MASTER');
  END IF;
END;

--删除emp表所有记录
delete from emp;

--回滚删除的数据
rollback;

--删除触发器
drop trigger aiud_emp_row

/*============================================================
                       示例 语句级触发器
  ============================================================*/
--语句级触发器
CREATE OR REPLACE TRIGGER aiud_emp
AFTER INSERT OR UPDATE OR DELETE
ON emp
BEGIN
  IF UPDATING THEN
    DBMS_OUTPUT.PUT_LINE('ORDER_MASTER 中的数据已更新');
  ELSIF DELETING THEN
    DBMS_OUTPUT.PUT_LINE('ORDER_MASTER 中的数据已删除');
  ELSIF INSERTING THEN
    DBMS_OUTPUT.PUT_LINE('数据已插入 ORDER_MASTER');
  END IF;
END;

--删除emp表所有记录
delete from emp;

--回滚删除的数据
rollback;

--删除触发器
drop trigger aiud_emp

/*============================================================
                       示例 INSTEAD OF触发器
  ============================================================*/

1.创建复杂视图
create or replace view dept_emp as
  select a.deptno,a.dname,b.empno,b.ename 
  from dept a inner join emp b
  on a.deptno=b.deptno;

2.通过视图插入纪录----失败。
insert into dept_emp values(50,'ADMIN','1223','MARY');
--失败原因,因为该视图涉及到2个表,emp是键保留表,dept是非键保留表。如果插入键保留表的数据,则不会报错,如果插入非键保留表的数据,则报错。
--什么是键保留表,是复杂视图(使用多个表创建的视图)中的其中一个表,该表的主键在视图中都是唯一且非空的,也是视图中的键,则该表是一个键保留表,如emp表。

--下面例子通过视图修改键保留表的列----成功
update dept_emp set ename='aaa' where empno=7788;

3.通过INSTEAD OF触发器添加-----成功
/*
  通过对视图的插入语句触发INSTEAD OF触发器实现:
  如果添加的部门不存在,则插入部门表
  如果添加的雇员不存在,则插入雇员;如果存在,则报主键重复错误
 */
create or replace trigger tr_in_dept_emp
  instead of insert on   dept_emp
  for each row
declare
       v_temp int;
begin
  --如果添加的部门不存在,则插入部门表
  select count(*) into v_temp from dept 
  where deptno=:new.deptno;
  if v_temp=0 then
     insert into dept (deptno,dname)values 
     (:new.deptno,:new.dname);
  end if;
  
  --如果添加的雇员不存在,则插入雇员;如果存在,则报主键重复错误
  select count(*) into v_temp from emp 
  where empno=:new.empno;
  if v_temp=0 then
     insert into emp
      (empno,ename,deptno) values (:new.empno,:new.ename,:new.deptno);
  else
     raise_application_error(-20001,'主键重复');
  end if;
end tr_in_dept_emp;

4.再执行插入记录-----成功
insert into dept_emp values(50,'ADMIN','1223','MARY');

5.查询插入后dept和emp表
select * from dept;
select * from emp;
0 0