2014-05-22 112 views
0

我有這個觸發器,它說警告:觸發器編譯錯誤創建。 你能給我快點建議嗎?觸發警告:創建編譯錯誤

/
CREATE OR REPLACE TRIGGER type_check 
    BEFORE INSERT ON carrs 
    FOR EACH ROW 
BEGIN 
    IF :new.weight > 3500 
    THEN 
    :new.type := 'nakladne'; 
    ELSE 
    :new.type := 'osobne'; 
    END IF; 
END; 
/

編輯:我仍然得到了同樣的警告

編輯:這裏是表定義

create table carrs (
id_Car Integer not null, 
id_board_unit Integer not null, 
id_evc_numbers Integer not null, 
id_owner Integer, 
weight Integer not null); 

這裏的錯誤:

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
4/5  PLS-00049: bad bind variable 'NEW.TYPE' 
6/5  PLS-00049: bad bind variable 'NEW.TYPE' 
+0

我不知道你使用的是什麼工具,但是在我的(PLSQL Developer)中,我可以打開觸發器,編譯它並實際看到有哪些錯誤消息。有什麼方法可以獲得更多信息嗎? – GolezTrol

+1

你的'carrs'表有一個名爲'type'的列嗎?你可以將表格定義添加到問題中嗎? –

+1

好吧,現在我對你的目標可能會很困惑。你的觸發器試圖給'carrs'表中的'type'列賦值。但是表中沒有任何字段甚至接近'type'。你甚至沒有任何'varchar2'列在你的表中。你希望你的觸發器能做什麼?你真的想更新其他表中的'type'列嗎? –

回答

0

如果你使用SQL *另外,輸入show errors後得到該警告顯示所報告的語法錯誤列表。當你知道他們是什麼而不是猜測時,診斷問題要容易得多。

至少,您對:new pseudorecord的引用需要包含冒號前綴:new而不是new。 PL/SQL中的賦值運算符也是:=而不是=。所以,至少你想要類似

CREATE OR REPLACE TRIGGER type_check 
    BEFORE INSERT ON carrs 
    FOR EACH ROW 
BEGIN 
    IF :new.weight > 3500 
    THEN 
    :new.type := 'nakladne'; 
    ELSE 
    :new.type := 'osobne'; 
    END IF; 
END; 

也可能有其他錯誤。如果有,請輸入show errors並編輯您的問題以包含它們。

如果您希望在表中添加一個名爲type的新列,您可以在創建觸發器之前執行此操作。儘管如此,這對於專欄來說並不是特別好的名字,因爲type也是Oracle中的一個保留字。我會選擇更有意義的東西,比如carr_type。您必須指定在創建新列時需要保留多少字符串。我猜你想空間10個字符

ALTER TABLE carrs 
    ADD(carr_type VARCHAR2(10 CHAR)); 

那麼你可能想UPDATE你的表填充新列的現有數據

UPDATE carrs 
    SET carr_type = (case when weight > 3500 
         then 'nakladne' 
         else 'osobne' 
         end) 

創建觸發器之前

CREATE OR REPLACE TRIGGER type_check 
    BEFORE INSERT ON carrs 
    FOR EACH ROW 
BEGIN 
    IF :new.weight > 3500 
    THEN 
    :new.carr_type := 'nakladne'; 
    ELSE 
    :new.carr_type := 'osobne'; 
    END IF; 
END; 
+0

你是我的新生英雄,希望你做得好,祝你有個美好的一天:-)再次非常感謝你的時間@justin – P3ntr4x