【问题标题】:Oracle create trigger error (bad bind variable)Oracle 创建触发器错误(错误的绑定变量)
【发布时间】:2013-02-06 06:55:06
【问题描述】:

我尝试使用以下代码创建触发器。

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'

有什么想法吗?谢谢。

【问题讨论】:

  • 我猜MYTABLE中有一个名为ID的列?
  • 你是对的。我将 ID 列重命名为 SECTION_ID 并忘记在触发器中重命名它。

标签: oracle plsql database-trigger


【解决方案1】:

如果您像我一样并且您的代码应该可以正常工作,请尝试在重新创建触发器之前明确删除它。愚蠢的神谕。

【讨论】:

    【解决方案2】:

    如果有人会使用适当的命名约定,这种类型的发现 错误会更容易(其中使用前置和后缀的正确方法) 用于更好地暗示其用途的通用对象名称 即这样的事情会发现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
    

    【讨论】:

      【解决方案3】:

      似乎错误代码告诉您表中没有这样的列 ID...

      【讨论】:

        【解决方案4】:

        您的环境不知何故将您的代码视为 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.
        

        注意尾随的“/” - 这在您编译它的应用程序中可能很重要。

        【讨论】:

          猜你喜欢
          • 2021-09-20
          • 2012-11-04
          • 1970-01-01
          • 1970-01-01
          • 2017-08-11
          • 2019-05-05
          • 1970-01-01
          • 1970-01-01
          • 2017-06-10
          相关资源
          最近更新 更多