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)
非常感谢!肯尼斯.
变异表错误意味着触发器代码可能不会在其拥有的表上发出DML语句.这是为了避免递归行为.解决方案非常简单.删除UPDATE语句.
这一陈述背后的意图并不十分清楚.这很常见,因为ORA-4091错误通常表示设计不良,例如数据模型不够规范化.我想这是你的情况.因此,解决问题需要比我们更多的业务知识.
您的SELECT语句似乎也失败了(发布的错误堆栈有点混乱).您试图用臭名昭着的WHEN OTHERS THEN NULL;构造来抑制该语句的失败.这是Teh Suck!立即将其删除.您需要知道您的代码失败,以及原因.如果:NEW.Deliver_To_Location_Id的填充是可选的,那么您不介意查找"失败"替换OTHERS为NO_DATA_FOUND.
| 归档时间: |
|
| 查看次数: |
5680 次 |
| 最近记录: |