2010-11-22 11 views
5

ich versuchte mit dem folgend, aber anscheinend ist es ungültig SQL:Auslöser zum Einfügen sysdate nach einem Einsatz in Oracle

CREATE OR REPLACE TRIGGER QUESTION_DATE BEFORE INSERT ON QUESTION 
FOR EACH ROW 
BEGIN 
INSERT INTO QUESTION(CREATED_TIMESTAMP) 
VALUES (SYSDATE); 
END; 

Die Frage Tabelle so weit wie folgt aussieht:

CREATE TABLE QUESTION 
( 
    QUESTION_ID    INTEGER not null, 
    LATEST_QUESTION   INTEGER not null, 
    CREATED_USER_ID   INTEGER not null, 
    CREATED_TIMESTAMP  TIMESTAMP not null,  
    CONSTRAINT PK_QUESTION PRIMARY KEY (QUESTION_ID) 
); 

CREATE SEQUENCE QUESTION_ID_SEQ INCREMENT BY 1 START WITH 1 NOCYCLE NOCACHE NOORDER; 

CREATE TRIGGER QUESTION_INSERT BEFORE INSERT ON QUESTION 
FOR EACH ROW 
BEGIN 
SELECT QUESTION_ID_SEQ.nextval 
INTO :new.QUESTION_ID 
FROM dual; 
END; 

ich benutze Toad for Oracle V9.0.1.8 wenn das relevante

+0

Geben Sie weitere Informationen. Ist die Spalte, die Sie versuchen, auf Sysdate festzulegen, die gleiche Tabelle wie die Zeile, die Sie gerade eingefügt haben? Wenn Sie beispielsweise in der Tabelle ColumnFirst und ColumnTheDate verwenden, möchten Sie ColumnTheDate für die gerade eingefügte Zeile gleich dem Wert von sysdate setzen? – DwB

+0

Yup, ich versuche, ColumnTheDate auf Sysdate für die Zeile, die ich gerade eingefügt habe – echoblaze

Antwort

12

Ich glaube, Sie wahrscheinlich dies wollen:

CREATE OR REPLACE TRIGGER QUESTION_DATE BEFORE INSERT ON QUESTION 
FOR EACH ROW 
BEGIN 
:NEW.CREATED_TIMESTAMP := SYSDATE; 
END; 

Ihre Trigger versucht eine andere Zeile in Frage einzufügen, die den Trigger ausgelöst würde und ...

+0

Ich bekomme immer noch eine "ORA-00900: ungültige SQL-Anweisung" beim Versuch, den Trigger hinzufügen – echoblaze

+0

Sieht Ihr Trigger ** genau ** wie mein? –

+0

Yup, ich habe die Anweisung kopiert und eingefügt – echoblaze

1

: new.created_timestamp: = sysdate

Statt o f einfügen.

Die Einfügung erfolgt bereits, es ist nicht mehr erforderlich.

Sie könnten Sysdate auch zum Standard für die Spalte machen, aber dies würde ermöglichen, dass der Wert in der insert-Anweisung überschrieben wird.

16

Dont einen Trigger verwenden, um einen Standardwert zu setzen in Oracle. Verwenden Sie stattdessen "DEFAULT" für die Spalte. Hier ist eine Beispielspalte

+0

Ich stimme zu. Beachten Sie jedoch, dass bei einer vorhandenen Tabelle die gesamte Tabelle gesperrt wird, während Oracle die neue Spalte auffüllt. – Dan

+1

Beachten Sie, dass dadurch der Zeitstempel für Aktualisierungen nicht aktualisiert wird. – gouderadrian

+0

Dies funktioniert nur für einfache Standardwerte. Wenn Sie eine PL/SQL-Funktion aufrufen müssen, um den Standardwert zu generieren (z. B. DBMS_RANDOM, um eine zufällige Zeichenfolge zu erstellen), kann "DEFAULT" nicht verwendet werden. – Malvineous

Verwandte Themen