2016-05-26 9 views
0

Dies mag eine einfache Abfrage für die meisten von Ihnen erscheinen, aber ich bin ein Anfänger in Oracle DB. Eine Tabelle hat unter Script-Oracle_Trigger: Automatische Aktualisierung einer Spalte basierend auf INSERT/UPDATE

CREATE TABLE PLAN_TABLE 
(
    PL_ID DECIMAL(10,0) PRIMARY KEY NOT NULL 
    ,PL_NAME VARCHAR2(300) DEFAULT NULL 
    ,UPDATED_TS TIMESTAMP DEFAULT SYSDATE NOT NULL 
    ,DELETE_FLAG DECIMAL(10,0) DEFAULT 0 NOT NULL 
); 

Die Forderung SYSDATE für UPDATED_TS für jeden neuen Datensatz erstellt wurde in die Tabelle eingefügt hat und auch im Fall, wenn der delete_flag auf 1 aktualisiert wird, kann es durch getan werden auslösen? Die unten Auslöser war created-

CREATE OR REPLACE TRIGGER PT_BEFORE_INSERT_TR 
BEFORE INSERT ON PLAN_TABLE 
FOR EACH ROW 
BEGIN 
SELECT SYSDATE INTO :new.UPDATED_TS FROM DUAL; 
dbms_output.put_line('Inserted'); 
END; 
/

Below Fehler aufgetreten ist, während Datensatz in die Tabellen- Fehler einfügen: ORA-04091: Tabelle I60_SCH04.PLAN_TABLE mutiert, Trigger/Funktion kann es nicht sehen

Können Sie mir bitte helfen, mich wissen zu lassen, wo ich den Fehler begehe? Gibt es einen besseren Weg, die Anforderung basierend auf INSERT/UPDATE zu erreichen?

Antwort

1

Der tatsächliche Fehler, den Sie erhalten, liegt an der Tatsache, dass Sie versuchen, aus einer Tabelle auszuwählen, die Sie tatsächlich ändern. Um das Problem zu vermeiden, gibt es ein paar Methoden, aber in Ihrem Fall sind die Dinge wirklich einfach.

SYSDATE eine Funktion ist, dass Sie direkt in PL/SQL-Block nennen könnte (was ein Trigger tatsächlich ist) und verwenden Sie den Wert mit dem Satz den Spaltenwert

CREATE OR REPLACE TRIGGER PT_BEFORE_INSERT_TR 
    BEFORE INSERT ON PLAN_TABLE 
    FOR EACH ROW 
BEGIN 
    :new.UPDATED_TS := sysdate; 
    dbms_output.put_line('Inserted'); 
END; 
/

OK, aktualisieren zurück dies deckt die Teil einfügen.

Zum Aktualisieren - noch einmal, viele Optionen. Einer könnte sein: Ändern Sie Ihren Trigger auf BEFORE INSERT oder UPDATE ON PLAN_TABLE.

In diesem Fall, wenn Sie aktualisieren oder einfügen - dieser Trigger wird für jede Zeile ausgelöst und aktualisiert die Datumsspalte entsprechend.

Und natürlich können Sie bestimmte Kontrollen in Trigger zur Verfügung verwenden, so etwas wie

IF INSERTING OR UPDATING('DELETE_FLAG') THEN 
    ... 
END IF; 

und Code in der Logik, die Sie benötigen.

+0

Vielen Dank @ Micklesh.I unten Proben versucht, aber endete mit folgenden ergebnis- CREATE OR TRIGGER TR_AP_BEF_UPDATE BEFORE UPDATE DER delete_flag AUF PLAN_TABLE FÜR JEDE REIHE BEGIN IF REPLACE: NEW.DELETE_FLAG = 1 THEN: NEW. UPDATED_TS: = SYSDATE END IF; dbms_output.put_line ('Eingeschaltet'); ENDE; / --result: Ungültige Trigger CREATE OR TRIGGER TR_AP_BEF_UPDATE BEFORE UPDATE OF delete_flag ON PLAN_TABLE FÜR JEDE ZEILE BEGIN REPLACE: NEW.UPDATED_TS: = SYSDATE; dbms_output.put_line ('Eingeschaltet'); ENDE; / - Ergebnis: Gültiger Trigger Kannst du den Fehler finden, der im INVALID TRIGGER begangen wurde? – Anshu

+0

Es scheint, Sie haben ein Semikolon (;) nach dem SYSDATE in der ersten Variante – micklesh

+0

verpasst, danke für das Lernen. Alles Gute. – Anshu