2013-02-21 19 views
8

次のコードでトリガーを作成しようとしています。Oracleがトリガーエラー(不良バインド変数)を作成します

CREATE OR REPLACE TRIGGER MYTABLE_TRG 
BEFORE INSERT ON MYTABLE 
FOR EACH ROW 
BEGIN 
select MYTABLE_SEQ.nextval into :new.id from dual; 
END; 

私はエラー

Error(2,52): PLS-00049: bad bind variable 'NEW.ID' 

任意のアイデアが取得していますか?ありがとう。

+1

を目撃しているのでしょうか?つまり、より自分の目的について、ヒンティングの一般的なオブジェクト名の )前と接尾辞を使用することを意味 – DCookie

+0

あなたは正しいです。 ID列の名前をSECTION_IDに変更し、トリガーで名前を変更するのを忘れました。 –

答えて

13

(ここで、適切なエラーコードがあなたを語っているあなたのテーブルには、カラムID ...

1

あなたの環境は、DDLステートメントではなく、SQLとしてコードを扱っています。これは、(コマンドプロンプトからはsqlplus.exeで実行されている)私の作品:

SQL> create sequence mytable_seq; 

Sequence created. 

SQL> create table mytable (id number); 

Table created. 

SQL> CREATE OR REPLACE TRIGGER MYTABLE_TRG 
    2 BEFORE INSERT ON MYTABLE 
    3 FOR EACH ROW 
    4 BEGIN 
    5 select MYTABLE_SEQ.nextval into :new.id from dual; 
    6 END; 
    7/

Trigger created. 

注末尾が「/」 - これは、あなたがこれをコンパイルしているアプリケーションで重要であるかもしれません。

0

1は、このタイプのスポッティングは、エラーの がはるかに容易になるだろう、適切な命名規則を使用している場合がありませんように思えます はこのようなものは、私はMYTABLEにIDという名前の列があります推測correct答え

--START -- CREATE A SEQUENCE 
    /* 
    create table "TBL_NAME" (
    "TBL_NAME_ID"  number(19,0) NOT NULL 
    , ... 
    */ 
    -------------------------------------------------------- 
    -- drop the sequence if it exists 
    -- select * from user_sequences ; 
    -------------------------------------------------------- 
    declare 
    c int; 
    begin 
    select count(*) into c from user_sequences 
     where SEQUENCE_NAME = upper('SEQ_TBL_NAME'); 
    if c = 1 then 
     execute immediate 'DROP SEQUENCE SEQ_TBL_NAME'; 
    end if; 
    end; 
/

    CREATE SEQUENCE "SEQ_TBL_NAME" 
    MINVALUE 1 MAXVALUE 999999999999999999999999999 
    INCREMENT BY 1 START WITH 1 
    CACHE 20 NOORDER NOCYCLE ; 


    -- CREATE 
    CREATE OR REPLACE TRIGGER "TRG_TBL_NAME" 
    BEFORE INSERT 
    ON "TBL_NAME" 
    REFERENCING NEW AS New OLD AS Old 
    FOR EACH ROW 
    DECLARE 
    tmpVar NUMBER; 

    BEGIN 
    tmpVar := 1 ; 

    SELECT SEQ_TBL_NAME.NEXTVAL INTO tmpVar FROM dual; 
    :NEW.TBL_NAME_ID := tmpVar; 

    END TRG_TBL_NAME; 
/
    ALTER TRIGGER "TRG_TBL_NAME" ENABLE; 
    -- STOP -- CREATE THE TRIGGER 
関連する問題