2013-02-21 6 views
8

Ich versuche, Trigger mit dem folgenden Code zu erstellen.Oracle create trigger error (schlechte Bindevariable)

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

Ich erhalte Fehler

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

Irgendwelche Ideen? Vielen Dank.

+1

ich nehme an, es gibt eine Spalte ID in MYTABLE benannt? – DCookie

+0

Sie haben Recht. Ich habe die ID-Spalte in SECTION_ID umbenannt und vergessen, sie im Trigger umzubenennen. –

Antwort

13

Es scheint, wie der Fehlercode sagt Ihnen, es gibt keine solche Spalte ID in der Tabelle ...

1

Irgendwie behandelt Ihre Umgebung Ihren Code als SQL anstelle einer DDL-Anweisung. Dies funktioniert für mich (läuft in sqlplus.exe von einer Eingabeaufforderung):

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. 

Hinweis der nacheilende „/“ - dies könnte in der Anwendung wichtig sein, Sie dies mit kompilieren.

0

, wenn man die richtige Namenskonvention das Spotten dieser Art von Fehlern wäre viel einfacher (wo richtige verwenden würde mit Vor- und Postfix bedeutet) für generische Objektnamen Hinting über ihren Zweck besser also so etwas wie dieses hätte die correct Antwort getupft

--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