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

不知何故,您的环境将您的代码视为 SQL 而不是 DDL 语句。这对我有用(从命令提示符在 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

如果使用适当的命名约定,则发现此类错误会更容易(其中适当的手段使用前缀和后缀),因为通用对象名称可以更好地暗示它们的目的,即这样的东西会发现正确的答案

  --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 回答
0

If you're like me and your code should be working, try dropping the trigger explicitly before you re-create it. Stupid Oracle.

于 2020-07-02T02:50:45.120 回答