对于简单视图,可以直接执行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
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,'张三');