ORA-04091和ORA-06512 ORA_SQLCODE:执行触发器时发生-4091错误

时间:2019-06-12 09:55:44

标签: plsql triggers oracle-apex

我试图执行触发它引发许多异常的触发器。请建议如何修改。

create or replace TRIGGER "WS5108"."AL_PROJECT_ORACLE_CODE_TRG" AFTER
INSERT 
ON ITIB_REQUESTS FOR EACH row
DECLARE  
 V_CODE varchar(200);
BEGIN
IF :NEW."J_PROJECT_ORACLE_CODE" IS NULL THEN 

SELECT distinct (PROJECT_ORACLE_CODE) INTO V_CODE 
FROM ITIB_PROJECT_ORACLE_CODE POC 
JOIN ITIB_VPDOMAIN VP ON (POC.VP_DOMAIN = VP.VP_DOMAIN) 
JOIN ITIB_REQUESTS ITIB ON (VP.ID = ITIB.VP_DOMAIN) 
WHERE VP.ID = :NEW."VP_DOMAIN" AND CAPEX_CATEGORY = :NEW."C_CAPEX_CATEGORY" ;
END IF;

UPDATE ITIB_REQUESTS SET  J_PROJECT_ORACLE_CODE = V_CODE;

EXCEPTION

when no_data_found then

  V_CODE := 0 ;

END;

1 个答案:

答案 0 :(得分:0)

在我看来,这里几乎没有问题。一个好的开始是阅读AskTom有关变异错误(https://asktom.oracle.com/pls/apex/f?p=100:11:::NO::P11_QUESTION_ID:9536903800346619276)。我想这会给你一个很好的主意。也有很多例子。

接下来,您尝试在另一个导致错误的更新期间更新同一表。因为这是同一张桌子,所以您可以做类似的事情

:NEW.J_PROJECT_ORACLE_CODE := V_CODE;

下一步是此SELECT可能返回未处理的空记录集(也许该字段可以为空?);或多个记录?例外不是最佳方法,因为它消耗大量资源。问题是,如果缺少数据,为什么要插入一些内容?也许合并更好?取决于许多因素。

其他错误可能是由突变错误引起的。