ORA-00036递归SQL级别错误:更新视图触发该错误的求助
解决ORA-00036递归SQL错误的方案
这个错误的根源很明确——你在INSTEAD OF触发器里又尝试更新视图VIEW_TEST本身,这直接导致了无限递归循环:
当你执行UPDATE VIEW_TEST时,触发器被触发;而触发器里的UPDATE VIEW_TEST又会再次触发同一个触发器,Oracle检测到递归层数超过了系统限制,就抛出了ORA-00036错误。
正确的解决思路
INSTEAD OF触发器的核心作用,就是把对视图的操作转换为对底层基表的操作。你的视图VIEW_TEST里的location字段来自dept表,所以直接更新dept表即可,不需要再碰视图。
修改后的触发器代码
CREATE OR REPLACE TRIGGER TRIG_TEST INSTEAD OF UPDATE ON VIEW_TEST FOR EACH ROW BEGIN -- 直接更新底层的dept表,用dept_no关联更可靠(因为它是主键) UPDATE dept d SET d.location = :NEW.location WHERE d.dept_no = :OLD.dept_no; END; /
如果你的业务场景必须用dept_name来定位记录(不推荐,因为部门名称可能重复),也可以改成:
CREATE OR REPLACE TRIGGER TRIG_TEST INSTEAD OF UPDATE ON VIEW_TEST FOR EACH ROW BEGIN UPDATE dept d SET d.location = :NEW.location WHERE d.dept_name = :OLD.dept_name; END; /
额外提醒
以后写INSTEAD OF触发器时,一定要记住:所有操作都要直接指向视图依赖的基表,绝对不能在触发器里再次操作视图本身,否则必然会触发递归错误。
内容的提问来源于stack exchange,提问作者user9652048
相关产品推荐
相关产品推荐

