ORA-00036:递归SQL级错误

时间:2018-05-06 10:10:18

标签: oracle

我使用'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)

任何人都可以帮助我..

先谢谢!!

2 个答案:

答案 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;
/