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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 11:30:55