Я проклял триггер, который наблюдает за одним столом. Когда пользователь меняет столбец selected_selected на Y, я хочу, чтобы оракул поднимал столбцы из этой таблицы и вставлял их в таблицу поиска, в которой отслеживаются кандидаты, которые в настоящее время активны. I.e = 'Y'. Когда я пытаюсь обновить столбец, я получаю ошибку ORA-04091. Триггеры не меняют таблицу, на которой она построена, и я зациклился на том, почему я получаю эту ошибку. Любая помощь будет принята с благодарностью - я был на нескольких сайтах и не может увидеть исправление, думаю, я смотрел на него слишком долго :)оракул триггер ORA-04091
CREATE OR REPLACE TRIGGER DEMO_SCHEMA.TRG_CANDIDATE_SELECTED
AFTER UPDATE OF CANDIDATE_SELECTED ON DEMO_SCHEMA.TBL_CANDIDATES FOR EACH ROW
BEGIN
IF :NEW.CANDIDATE_SELECTED = 'Y' THEN
INSERT INTO DEMO_SCHEMA.TBL_CANDIDATES_LKP
(UPDATED_DT, GROUP_ID, CAND_ID
,STAGE, STEP, EQUIPMENT, ORDER_REQ
,INCLUDED_IN_STUDY)
SELECT SYSDATE, GROUP_ID, CAND_ID, STAGE
,STEP, TRIM(REGEXP_SUBSTR(EQUIPMENT, '[^,]+', 1, LEVEL)) EQUIPMENT
,(CASE WHEN UPPER(ORDER_REQ) = 'FALSE' THEN 1
ELSE ROW_NUMBER() OVER (PARTITION BY GROUP_ID, CAND_ID, STAGE, STEP ORDER BY CAND_ID)
END) ORDER_REQ, INCLUDED_IN_STUDY
FROM (
SELECT GROUP_ID, CAND_ID
,STAGE, STEP, EQUIPMENT, EQUIPMENT EQUIP
,ORDER_REQ, INCLUDED_IN_STUDY
FROM DEMO_SCHEMA.TBL_CANDIDATES
WHERE GROUP_ID = :NEW.GROUP_ID
AND LOT_ID = :NEW.CAND_ID
AND STAGE = :NEW.STAGE
AND STEP = :NEW.STEP
)
CONNECT BY LEVEL <= REGEXP_COUNT(EQUIP,', ')+1;
ElSIF :NEW.CANDIDATE_SELECTED = 'N' THEN
UPDATE DEMO_SCHEMA.TBL_CANDIDATE_LKP
SET INCLUDED_IN_STUDY = :NEW.CANDIDATE_SELECTED
WHERE GROUP_ID = :NEW.GROUP_ID
AND CAND_ID = :NEW.CAND_ID
AND STAGE = :NEW.STAGE
AND STEP = :NEW.STEP;
END IF;
END TRG_CANDIDATE_SELECTED;
/
Там может быть ошибка синтаксиса в там, но это потому, что мне пришлось изменить несколько вещей, прежде чем я разместил. Этот код компилируется в Oracle. Cheers.
И к какому сообщению об ошибке относится «ORA-04091»? Пожалуйста, поставьте полное сообщение об ошибке рядом с номером ошибки; мы не все гуляем по энциклопедиям номеров ошибок Oracle и их соответствующих сообщений об ошибках! * {:-) – Boneist
Триггер уровня на 'tbl_candidates' обычно не разрешается запрашивать' tbl_candidates'. Не зная вашу модель данных, вам действительно нужно запрашивать 'tbl_candidates' или вы можете просто использовать данные, которые уже находятся в псевдозаписке': new'? –
@JustinCave, но tbl_candidates в инструкции insert находится в другой схеме, где tbl_candidates включается триггер, предполагая, что OP не сделал опечатку в своем примере кода. – Boneist