Ich habe einen Trigger, der eine Tabelle überwacht. Wenn der Benutzer die Spalte candidate_selected in ein Y ändert, möchte ich, dass oracle Spalten aus dieser Tabelle hebt und sie in eine Nachschlagetabelle einfügt, die die aktuell aktiven Kandidaten verfolgt, d. H. "Y". Wenn ich versuche, die Spalte zu aktualisieren, erhalte ich den Fehler ORA-04091. Der Auslöser ändert nicht die Tabelle, auf der er erstellt wird, und ich bin fest, warum ich diesen Fehler bekomme. Jede Hilfe wäre sehr dankbar - ich habe ein paar Seiten und kann das Update nicht sehen, glaube, ich habe zu lange auf sie gestarrt :)Orakel-Trigger 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;
/
Es gibt einen Syntaxfehler sein kann da aber musste ich ein paar Dinge ändern bevor ich gepostet habe. Dieser Code wird in Oracle kompiliert. Prost.
Und zu welcher Fehlermeldung gehört "ORA-04091"? Bitte geben Sie die vollständige Fehlermeldung neben der Fehlernummer an. Wir laufen nicht alle Enzyklopädien mit Oracle-Fehlernummern und ihren entsprechenden Fehlermeldungen! * {: – Boneist
Ein Trigger auf 'row-level' auf 'tbl_candidates' darf generell 'tbl_candidates' nicht abfragen. Wenn Sie Ihr Datenmodell nicht kennen, müssen Sie wirklich "tbl_candidates" abfragen oder können Sie einfach Daten verwenden, die bereits im ': new' Pseudo-Record enthalten sind? –
@JustinCave aber die Tbl_Candidates in der Insert-Anweisung ist in einem anderen Schema zu den Tbl_Candidates der Trigger ist an, vorausgesetzt, das OP hat nicht einen Tippfehler in ihrem Beispiel-Code gemacht. – Boneist