ORA-04091在xxx上插入更新之前创建或替换触发器xxx

0 oracle triggers plsql exception ora-04091

有人可以帮我纠正下面的触发器吗?我被分配了这个问题,但我的技术技能有限.

我的脚本点击了下面的错误(ORA 4091):

处理标准采购订单编号:27179

......................................

更新PO状态..

完成批准处理.

dist id 611294gl金额10000.88 bill_del_amount 0 l_amount 10000.88

发生了一些异常**ORA-04091:表PO.PO_DISTRIBUTIONS_ALL正在变异,

触发器/功能可能看不到它**

ORA-06512:在"APPS.XXAET_PO_DELIVER_TO_TRG",

第22行

ORA-01403:未找到任何数据

ORA-04088:执行触发期间出错

"APPS.XXAET_PO_DELIVER

PL/SQL过程成功完成.

SQL>

我设法在客户端机器中找到自定义触发器,但在研究之后我无法确定sql的错误点.请帮忙!

CREATE OR REPLACE TRIGGER apps.xxaet_po_deliver_to_trg
BEFORE INSERT OR UPDATE ON po_distributions_all
   FOR EACH ROW
DECLARE
   l_emp_name   VARCHAR2 (300);
   l_sqlcode    VARCHAR (30)   := SQLCODE;
   l_sqlerrm    VARCHAR (400)  := SUBSTR (SQLERRM, 1, 399);
   x_profile_value  VARCHAR (10) ;
BEGIN

x_profile_value := fnd_profile.value('ORG_ID');
  Select Ship_To_Location_ID
  INTO :NEW.Deliver_To_Location_Id
  from PO_LINE_LOCATIONS_ALL
  WHERE line_location_id = :NEW.line_location_id
  AND ORG_ID = x_profile_value
  ;

EXCEPTION
   WHEN OTHERS
   THEN
      NULL;

   UPDATE PO_DISTRIBUTIONS_ALL SET Deliver_To_Location_Id = :NEW.Deliver_To_Location_Id
   WHERE line_location_id = :NEW.line_location_id;

END;

/
Run Code Online (Sandbox Code Playgroud)

非常感谢!肯尼斯.

APC*_*APC 5

变异表错误意味着触发器代码可能不会在其拥有的表上发出DML语句.这是为了避免递归行为.解决方案非常简单.删除UPDATE语句.

这一陈述背后的意图并不十分清楚.这很常见,因为ORA-4091错误通常表示设计不良,例如数据模型不够规范化.我想这是你的情况.因此,解决问题需要比我们更多的业务知识.

您的SELECT语句似乎也失败了(发布的错误堆栈有点混乱).您试图用臭名昭着的WHEN OTHERS THEN NULL;构造来抑制该语句的失败.这是Teh Suck!立即将其删除.您需要知道您的代码失败,以及原因.如果:NEW.Deliver_To_Location_Id的填充是可选的,那么您不介意查找"失败"替换OTHERSNO_DATA_FOUND.