2013-02-21 2 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

Я полагаю, что есть столбец с именем ID в MYTABLE? – DCookie

+0

Вы правы. Я переименовал столбец ID в SECTION_ID и забыл переименовать его в триггере. – 2013-02-21 03:34:08

ответ

13

Похоже, что код ошибки говорят вам, что нет такого столбца ID в таблице ...

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. 

Примечания тянущегося «/» - это может быть важно в приложении вы компилируете это с.

0

, если можно было бы использовать надлежащее соглашение об именовании кровянистых выделений этого типа ошибок были бы гораздо проще (где собственно означает использование до и postfixes) для родовых имен объектов намекая о своей цели лучше то есть что-то вроде этого бы заметил 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 
Смежные вопросы