2014-05-22 43 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