2010-11-22 16 views
5

He intentado utilizar el siguiente, pero al parecer es SQL no válida:gatillo para insertar sysdate después de una inserción en Oracle

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

La pregunta tabla se parece a esto hasta ahora:

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; 

estoy usando Toad para Oracle V9.0.1.8 si que es relevante

+0

Dar más información. ¿La columna que intentas establecer en sysdate es la misma que la fila que acabas de insertar? Por ejemplo, si su tabla tiene ColumnFirst y ColumnTheDate, ¿está intentando establecer ColumnTheDate igual a sysdate para la fila que acaba de insertar? – DwB

+0

Sí, estoy intentando establecer ColumnTheDate a Sysdate para la fila que acabo de insertar – echoblaze

Respuesta

12

creo que es probable que desee esto:

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

Su gatillo intenta insertar otra fila en cuestión, que se dispare el gatillo y ...

+0

Todavía estoy obteniendo una "ORA-00900: instrucción SQL no válida" cuando intento agregar el desencadenante – echoblaze

+0

¿Tiene el activador ** ** exactamente ¿como el mío? –

+0

Sí, copié y pegué la declaración – echoblaze

1

: new.created_timestamp: = sysdate

lugar o f inserte.

La inserción ya está ocurriendo, no es necesario volver a hacerlo.

También podría hacer que sysdate sea el valor predeterminado para la columna, pero eso permitiría que el valor se anule en la instrucción de inserción.

16

no utiliza un disparador para establecer un valor predeterminado en Oracle En su lugar, use "DEFAULT" en la columna. Aquí hay una columna de ejemplo

CREATED_TIMESTAMP TIMESTAMP DEFAULT SYSDATE NOT NULL,
+0

Estoy de acuerdo. Solo tenga en cuenta que si se trata de una tabla existente, toda la tabla se bloqueará mientras Oracle llene la nueva columna. – Dan

+1

Tenga en cuenta que esto no actualizará la marca de tiempo en las actualizaciones. – gouderadrian

+0

Esto solo funciona para valores predeterminados simples. Si necesita llamar a una función PL/SQL para generar el valor predeterminado (por ejemplo, DBMS_RANDOM para producir una secuencia aleatoria de caracteres) entonces 'DEFAULT' no se puede usar. – Malvineous

Cuestiones relacionadas