我试图执行触发它引发许多异常的触发器。请建议如何修改。
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;
答案 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可能返回未处理的空记录集(也许该字段可以为空?);或多个记录?例外不是最佳方法,因为它消耗大量资源。问题是,如果缺少数据,为什么要插入一些内容?也许合并更好?取决于许多因素。
其他错误可能是由突变错误引起的。