10

次のコードでトリガーを作成しようとしています。

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'

何か案は?ありがとう。

4

4 に答える 4

20

エラーコードは、テーブルにそのような列IDがないことを示しているようです...

于 2013-02-21T06:48:12.497 に答える
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.

末尾の「/」に注意してください。これは、これをコンパイルするアプリケーションで重要になる場合があります。

于 2013-02-21T06:36:36.537 に答える
0

あなたが私のようで、コードが機能するはずである場合は、再作成する前にトリガーを明示的に削除してみてください。愚かなオラクル。

于 2020-07-02T02:50:45.120 に答える
0

適切な命名規則を使用する場合、このタイプのエラーの発見ははるかに簡単になります (適切な意味は前置および後置を使用することを意味します) 目的をよりよく示唆する一般的なオブジェクト名の場合、つまり、このようなものは正しい答えを見つけたでしょう

  --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
于 2015-08-10T06:59:49.810 に答える