2016-05-26 17 views
0

これはほとんどの場合、単純な問合せに見えるかもしれませんが、Oracle DBの初心者です。 以下の表は、script-Oracle_Trigger: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 
); 

で作成された要件はDELETE_FLAGが1に更新されたときに表にしても、ケースに挿入された新しいレコードのUPDATED_TSためSYSDATEを持つことであることをすることによって行うことができます引き金? ORA-04091は:表I60_SCH04.PLAN_TABLEが変異され、トリガ/関数

それを表示しないことが 以下トリガ卓上 エラーにレコードを挿入中に発生したエラー以下

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; 
/

created-ました間違いをどこにしているのか教えてもらえますか? INSERT/UPDATEに基づいて要件を達成するためのよりよい方法はありますか?

答えて

1

実際のエラーは、実際に変更しているテーブルから選択しようとしているためです。問題を回避するには、いくつかの方法がありますが、事例は本当に簡単です。

SYSDATEは、このカバー、セットを更新するために、返された列の値

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あなたは(トリガーが実際にある)PL/SQLブロック内で直接呼び出して値を使用することができることを、関数であります挿入部分。

更新のために、もう一度、多くのオプション。 1つは、あなたのトリガーをBEFORE INSERTまたはUPDATE ON PLAN_TABLEに変更することです。

この場合、更新または挿入を発行するたびに、このトリガーが各行に対して起動され、それに応じて日付列が更新されます。

そしてもちろん、あなたは、トリガーで利用可能な特定のチェック、必要なロジックで

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

のようなものとコードを使用することができます。 Micklesh.I @

+0

多くのおかげでは、サンプルの下に試みたが、結果 - が をBEGIN、CREATE OR EACH ROW FOR PLAN_TABLE ON DELETE_FLAG OF UPDATE BEFOREトリガーTR_AP_BEF_UPDATE をREPLACE以下で終了IF:NEW.DELETE_FLAG = 1 THEN:NEW。 UPDATED_TS:= SYSDATE END IF; dbms_output.put_line( '挿入'); END; / --result:NEW.UPDATED_TS:EACH ROW はBEGINの無効なトリガー がDELETE_FLAG ON PLAN_TABLE の更新前TRIGGER TR_AP_BEF_UPDATE を作成するか、またはREPLACE = SYSDATEと、 dbms_output.put_line( '挿入'); END; / - 結果:有効なトリガー INVALID TRIGGERでコミットされた間違いを見つけられますか? – Anshu

+0

最初の亜種のSYSDATEの後にセミコロン(;)がありませんでした。 – micklesh

+0

学習に感謝します。ではごきげんよう。 – Anshu

関連する問題