ORA-04091 и ORA-06512 ora_sqlcode: -4091 ошибка при выполнении триггера - PullRequest
0 голосов
/ 12 июня 2019

Я пытался выполнить триггер его бросая много исключений.Пожалуйста, предложите, как это можно изменить.

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 голосов
/ 12 июня 2019

Мне кажется, здесь мало вопросов. Хорошим началом было бы прочитать AskTom о мутирующей ошибке (https://asktom.oracle.com/pls/apex/f?p=100:11:::NO::P11_QUESTION_ID:9536903800346619276). Полагаю, это даст вам довольно хорошую идею. Также есть много примеров.

Затем вы пытаетесь обновить ту же таблицу во время другого обновления, которое вызывает ошибку. Поскольку это та же таблица, вы можете просто сделать что-то вроде

:NEW.J_PROJECT_ORACLE_CODE := V_CODE;

Далее, этот SELECT может возвращать нулевой набор записей, который не обрабатывается (может быть, поле может быть обнуляемым?); или более одной записи? Исключение - не лучший подход, потому что оно сильно потребляет ресурсы. Вопрос в том, зачем вставлять что-то, если отсутствуют данные? Может быть, MERGEing лучше? Зависит от многих факторов.

Другие ошибки, вероятно, являются результатом ошибки мутации.

...