You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:33:47