本文主要是介绍【PL/SQL】替换触发器的详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
替换触发器——instead of
替换触发器,它的触发时机是instead of,与其他类型触发器不同的是,替换触发器定义在视图(一种数据库对象)上的,而不是定义在表上。由于视图是由多个基表连接组成的逻辑结构,所有一般不允许用户进行DML操作(insert,update,delete等操作),这样当用户编写替换触发器后,对视图操作实际上就变成了执行触发器中的PL/SQL操作。
先创建视图
create view view_emp_dept
as select empno,ename,dept.deptno,dname,job,hiredate from emp,dept
where emp.deptno = dept.deptno;
注意:如果没有创建view_emp_dept视图,在没有穿件“替换触发器”之前,如果尝试向该视图中插入数据,就会报错
ORA-01776:无法通过联接视图修改多个基表
创建一个关于view_emp_dept视图insert事件中的触发器
SQL>create or replace trigger tri_insert_view instead of insert on view_emp_dept for each row
declare row_dept deptj%rowtype;
begin select * into row_dept from dept where deptno = :new.deptno;if sql%notfound then insert into dept(deptno,dname) values (:new.deptno,:new,dname);end if;insert into emp(empno,enmae,deptno,job,hiredate) values (:new.empno,:new.ename,:new.deptno,:new.job,:new.hiredate) ;end tri_insert_view;/
注意:new和:old分别是原值标识符和新值标识符,
如果一个表有较多的列,使用%ROWTYPE来定义一个表示表中一行记录的变量,比分别使用%TYPE来定义表示表中各个列的变量要简洁得多,并且不容易遗漏、出错。这样会增加程序的可维护性。
SQL%NOTFOUND返回的数据类型是一个布尔值。布尔值与前一条sql语句相关。当最近的一条sql语句没有操作任何行的时候,返回true。否则返回false,而SQL%FOUND正好相反
接下来向视图中插入数据:
insert into view_emp_dept (empno,ename,deptno,dname,job,hiredate)
values(8888,'东方',10,'ACCOUNTING','CASHIER',sysdate);
这篇关于【PL/SQL】替换触发器的详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!