PL/SQL触发器异常问题:合法Product ID返回'Not found'
问题根源与解决方案
问题出在你触发器里的PRAGMA AUTONOMOUS_TRANSACTION——这个自治事务声明完全多余,反而引发了异常干扰。
具体原因:
- 你的触发器只是从
ALL_PRODUCTS_TABLE查询数据同步到MY_TABLE的PRODUCT_NAME字段,根本不需要独立的事务上下文。自治事务会创建一个和主事务完全隔离的新事务环境,这完全没必要。 - 当触发器使用自治事务但没有显式执行
COMMIT或ROLLBACK时,Oracle会在触发器结束时自动回滚这个自治事务。这个隐性回滚操作会干扰正常的SELECT执行逻辑,导致原本能查到数据的查询意外触发no_data_found异常,最终返回'Not found'。 - 另外,如果你的测试是在同一个事务中先修改了
ALL_PRODUCTS_TABLE(比如刚插入一个产品还没提交),自治事务因为看不到主事务未提交的数据,也会触发no_data_found——但你提到用的是已存在的合法ID,所以核心原因还是自治事务的隐性回滚干扰。
修复方案:
直接删除PRAGMA AUTONOMOUS_TRANSACTION声明,同时可以删掉未使用的V_COUNT变量,简化后的触发器代码如下:
create or replace TRIGGER MY_TRIGGER BEFORE UPDATE OF PRODUCT_ID ON MY_TABLE FOR EACH ROW BEGIN SELECT DISTINCT PRODUCT_NAME INTO :NEW.PRODUCT_NAME FROM ALL_PRODUCTS_TABLE WHERE PRODUCT_ID = :NEW.PRODUCT_ID; EXCEPTION WHEN no_data_found THEN :NEW.PRODUCT_NAME := 'Not found'; WHEN too_many_rows THEN :NEW.PRODUCT_NAME := 'Multiple matches'; -- 可选,处理同一ID对应多个不同名称的情况 END;
内容的提问来源于stack exchange,提问作者JB999
相关产品推荐
相关产品推荐

