PL/SQL_触发器4(建立INSTEAD OF触发器)

对于简单视图,可以直接执行INSERT,UPDATE和DELETE操作。但是对于复杂视图,不允许直接执行INSERT,UPDATE和DELETE操作。当视图符合以下任何一种情况时,都不允许直接执行DML操作。具体情况如下:
1)具有集合操作符(UNION,UNION ALL,INTERSECT,MINUS);
2)具有分组函数(MIN,MAX,SUM,AVG,COUNT等);
3)具有GROUP BY,CONNECT BY或START WITH等子句;
4)具有DISTINCT关键字;
5)具有连接查询;
为了在具有以上情况的复杂视图上执行DML操作,必须要基于视图建立INSTEAD-OF触发器。在建立了INSTEAD-OF触发器之后,就可以基于复杂视图执行INSERT,UPDATE和DELETE语句。但建立INSTEAD-OF触发器有以下注意事项:
1)INSTEAD OF选项只适用于视图
2)当基于视图建立触发器时,不能指定BEFORE和AFTER选项
3)在建立视图时没有指定WITH CHECK OPTION选项
4)当建立INSTEAD OF触发器时,必须指定FOR EACH ROW选项

1、建立复杂视图dept_emp
CREATE OR REPLACE VIEW dept_emp
AS
  SELECT d.deptno,d.dname,e.empno,e.ename
  FROM emp e,dept d
  WHERE e.deptno = d.deptno;
  
INSERT INTO dept_emp (deptno,dname,empno,ename)
VALUES (60,'研发部',1234,'张三');
2、建立INSTEAD-OF触发器
CREATE OR REPLACE TRIGGER tr_instead_of_dept_emp
INSTEAD OF INSERT
ON dept_emp
FOR EACH ROW
DECLARE
  v_temp INTEGER;
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);
  END IF;
END;
测试:
INSERT INTO dept_emp (deptno,dname,empno,ename)
VALUES (60,'研发部',1234,'张三');
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值