我使用'emp'
和'dept'
表创建了一个视图。
create or replace view view_test (emp_name,dept_name,location) as
select e.emp_name,d.dept_name,d.location from emp e,dept d
where e.DEPT_NO=d.DEPT_NO;
'INSTEAD OF' trigger
:
CREATE OR REPLACE TRIGGER TRIG_TEST
INSTEAD OF UPDATE ON VIEW_TEST
FOR EACH ROW
BEGIN
UPDATE VIEW_TEST
SET LOCATION=:NEW.LOCATION
WHERE DEPT_NAME=OLD.DEPT_NAME;
END;
/
当我尝试更新VIEW_TEST
中的值时,我收到以下错误:
update view_test
set location ='ASIA'
WHERE DEPT_NAME='HR';
ORA-00036:超出递归SQL级别的最大数量(50)
任何人都可以帮助我..
先谢谢!!
答案 0 :(得分:1)
当您了解如何处理INSTEAD OF TRIGGER
DML
操作的特定逻辑时,VIEW
会很有帮助。通常,如果视图包含多个表连接,并且我们希望确保Oracle如何在视图的基础表上处理此类插入/更新,则建议使用此类触发器。
通过尝试更新Trigger
内的相同视图,您犯了一个大错误,正如Ben在评论中已经告知的那样,会导致无限的更新递归。 < / p>
我认为您实际上要做的是更新dept
表。所以,您可以重新编写Trigger
看起来像这样。
CREATE OR replace TRIGGER trig_test
INSTEAD OF UPDATE ON view_test
FOR EACH ROW
BEGIN
UPDATE dept
SET location = :NEW.location -- include other columns
WHERE dept_name = :OLD.dept_name;
END;
/
您还可以向其他基础表列添加其他更新。 然后,像您这样的更新语句将按预期工作。
update view_test set location ='ASIA' WHERE DEPT_NAME='HR';
答案 1 :(得分:0)
下面是正确的触发码,可以解决您的问题,现在就试试吧。
CREATE OR REPLACE TRIGGER TRIG_TEST
INSTEAD OF UPDATE ON VIEW_TEST
FOR EACH ROW
BEGIN
UPDATE dept
SET LOCATION=:NEW.LOCATION
WHERE DEPT_NO = (select dept_no
from dept
where DEPT_NAME=:OLD.DEPT_NAME
and rownum <=1);
END;
/