2010-11-22 5 views
5
に挿入した後、SYSDATEを挿入し、私が使用してみました

次どうやらそれは、無効なSQLです:トリガーは、Oracle

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

の表は、これまでのところ、このようになります。質問:

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; 

私が使用していますOracle V9.0.1.8用ヒキガエルそれが関連

+0

詳細を記入してください。 sysdateに設定しようとしている列は、挿入した行と同じテーブルですか?たとえば、テーブルにColumnFirstとColumnTheDateがある場合、挿入したばかりの行に対して、ColumnTheDateをsysdateに設定しようとしていますか? – DwB

+0

Yup、私はちょうど挿入された行のSysdateにColumnTheDateを設定しようとしています – echoblaze

答えて

12

私はあなたがおそらくこの欲しいと思う:

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

をあなたのトリガが

+0

トリガーを追加しようとすると "ORA-00900:無効なSQLステートメント"が表示されます – echoblaze

+0

トリガーは**正確に表示されます**私のもののように? –

+0

うわー、私はステートメントをコピー&ペーストしました – echoblaze

1

だ場合:new.created_timestamp:= SYSDATE

代わりにO fインサート。

挿入が既に発生しているため、再度挿入する必要はありません。

また、sysdateを列のデフォルトにすることもできますが、これによりinsert文で値を上書きすることができます。

16

いけないデフォルト値を設定するためにトリガーを使用するトリガーを起動思われる、QUESTIONに別の行を挿入しようとすると...オラクルでは、代わりに、列の「DEFAULT」を使用します。 ここにexmple列があります

CREATED_TIMESTAMP TIMESTAMP DEFAULT SYSDATE NOT NULL,
+0

私は同意します。既存の表であれば、Oracleが新しい列を移入する間に表全体がロックされることに注意してください。 – Dan

+1

更新時のタイムスタンプは更新されません。 – gouderadrian

+0

これは単純なデフォルト値に対してのみ機能します。 PL/SQLファンクションをコールしてデフォルト値(たとえば、ランダムな文字列を生成するDBMS_RANDOMなど)を生成する必要がある場合、「DEFAULT」は使用できません。 – Malvineous