2013-02-21 12 views
8

मैं निम्नलिखित कोड के साथ ट्रिगर बनाने की कोशिश कर रहा हूं।ओरेकल ट्रिगर त्रुटि (खराब बाध्य चर)

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

मुझे लगता है वहाँ mytable में आईडी नाम के एक स्तंभ है देखा होता? – DCookie

+0

आप सही हैं। मैंने आईडी कॉलम को SECTION_ID में बदल दिया और ट्रिगर में इसका नाम बदलना भूल गया। –

उत्तर

13

ऐसा लगता है कि त्रुटि कोड तुमसे कह अपनी तालिका में ऐसी कोई स्तंभ आईडी ...

1

किसी भी तरह आपका पर्यावरण डीडीएल कथन के बजाय एसक्यूएल के रूप में आपके कोड का इलाज कर रहा है। यह मैं हूँ (एक कमांड प्रॉम्प्ट से 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 
संबंधित मुद्दे