2011-07-05 9 views
2

Oracle 11gで次のSQL文を実行しようとしています。私はオラクルには経験がありませんし、なぜこれが失敗するのか分かりません。このクエリは開発者によって私に提供されました。Ora-04072:INVALID TRIGGER TYPE

これをOEMのSQLワークシートで実行しようとしていました。

CREATE OR REPLACE TRIGGER TBL_ADMINCOMMAND_TRG BEFORE 
INSERT OR UPDATE ON tbl_AdminCommands FOR EACH ROW 
BEGIN 
IF inserting 
AND :new.ADMINCOMMANDID IS NULL THEN 
SELECT TBL_ADMINCOMMANDS_SEQ.nextval INTO :new.ADMINCOMMANDID FROM DUAL; 
END IF; 
END; 
ALTER TRIGGER TBL_ADMINCOMMAND_TRG ENABLE; 

答えて

2
:実際に

:new.ADMINCOMMANDID := TBL_ADMINCOMMANDS_SEQ.nextval; 

、全体トリガに簡略化することができます

SQL * Plusを使用している場合は、単独の行に単一のスラッシュを付けてPL/SQLコマンドを終了する必要があります。

CREATE OR REPLACE TRIGGER TBL_ADMINCOMMAND_TRG 
BEFORE INSERT OR UPDATE ON tbl_AdminCommands 
FOR EACH ROW 
BEGIN 
    IF inserting AND :new.ADMINCOMMANDID IS NULL 
    THEN 
    SELECT TBL_ADMINCOMMANDS_SEQ.nextval 
     INTO :new.ADMINCOMMANDID 
     FROM DUAL; 
    END IF; 
END; 
/

ALTER TRIGGER TBL_ADMINCOMMAND_TRG ENABLE; 

はまた、あなたのトリガはあなたが唯一のトリガーBEFORE INSERTを行うことができIF inserting使用している場合ことに注意してください。

+0

私はOEMを通じてSQL Worksheetを使用していました。私はSQL * PLUSに切り替えて、正しく実行しました。 – jerle78

6

あなたは私のために動作しますが、唯一のように2つの別々のコマンドを示しコード:

1)

CREATE OR REPLACE TRIGGER TBL_ADMINCOMMAND_TRG BEFORE 
INSERT OR UPDATE ON tbl_AdminCommands FOR EACH ROW 
BEGIN 
IF inserting 
AND :new.ADMINCOMMANDID IS NULL THEN 
SELECT TBL_ADMINCOMMANDS_SEQ.nextval INTO :new.ADMINCOMMANDID FROM DUAL; 
END IF; 
END; 

2)

ALTER TRIGGER TBL_ADMINCOMMAND_TRG ENABLE; 

はそれらを1つをやってみてください時間。

さておき、このラインとして:

SELECT TBL_ADMINCOMMANDS_SEQ.nextval INTO :new.ADMINCOMMANDID FROM DUAL; 

は11gで、これに簡略化することができる。

CREATE OR REPLACE TRIGGER TBL_ADMINCOMMAND_TRG 
BEFORE INSERT ON tbl_AdminCommands 
FOR EACH ROW 
WHEN (NEW.ADMINCOMMANDID IS NULL) 
BEGIN 
    :new.ADMINCOMMANDID := TBL_ADMINCOMMANDS_SEQ.nextval; 
END; 
+0

+1の簡略化されたバージョン –

+0

SQL * Plusでクエリを再実行しても正常に動作しました。私はそれがOEMによるSQLワークシートに特有のものだと思います。ヒント、みんなありがとう! – jerle78