创建Oracle INSERT触发器报ORA-04073错误的问题咨询
报错原因定位
- 触发ORA-04073的直接原因:Oracle中只有UPDATE触发器支持
OF 列名语法指定触发列,INSERT触发器不允许加列列表,你代码中BEFORE INSERT OF IDPRODUCT,QUANTITY ON BB_BASKETITEM的写法不符合语法规范。 - 其他隐藏语法问题:行级触发器中引用新行值必须加
:NEW前缀,你代码中NEW.IDPRODUCT、NEW.QUANTITY漏写了冒号。 - 逻辑判断错误:逻辑运算符
AND优先级高于OR,原写法等价于IDPRODUCT=3 OR (IDPRODUCT=9 AND QUANTITY<10),只要IDPRODUCT为3不管数量多少都会进入判断分支,不符合你的业务规则。 - 功能实现问题:仅用
DBMS_OUTPUT.PUT_LINE只会打印提示信息,不会终止不符合规则的插入操作,无法实现校验效果。
正确实现代码
CREATE OR REPLACE TRIGGER trg_bb_basketitem_check_qty BEFORE INSERT ON BB_BASKETITEM FOR EACH ROW BEGIN IF (:NEW.IDPRODUCT = 3 OR :NEW.IDPRODUCT = 9) AND :NEW.QUANTITY < 10 THEN RAISE_APPLICATION_ERROR(-20001, '请输入大于10的数量'); END IF; END; /
实现说明
- 移除了INSERT后的列列表,符合INSERT触发器语法要求
- 所有新行值引用统一添加
:NEW前缀,修正语法错误 - 给IDPRODUCT的判断条件加括号,调整逻辑优先级匹配业务规则
- 使用
RAISE_APPLICATION_ERROR抛出自定义业务异常,错误码取Oracle允许的自定义区间-20000~-20999,抛出异常后插入操作会直接终止,实现校验拦截效果。
内容的提问来源于stack exchange,提问作者AAA
相关产品推荐
相关产品推荐

