在触发器中错误使用绑定变量

时间:2019-04-26 23:34:33

标签: sql oracle triggers sqlplus

我在SQL领域还很陌生,我正在尝试为我进行的练习设置 TRIGGER 。我似乎找不到解决方案。这是代码:

CREATE TRIGGER C3
BEFORE UPDATE OF rate ON Magazines
FOR EACH ROW
WHEN(:NEW.rate < :OLD.rate*0.75)
BEGIN
    IF :NEW.rate < 0 THEN
        :NEW.rate = 0;
        RAISE_APPLICATION_ERROR(-20003, 'Rate should never be below 0.');
    ELSE
        :NEW.rate = :OLD.rate*0.75;
END;
/

当我尝试编译时,它向我显示此错误: Non valid use of bind variable in WHEN of a trigger

我尝试删除:NEW之前的OLD,但是却给了我另一个编译器错误。

有什么想法吗? 非常感谢!

2 个答案:

答案 0 :(得分:2)

pl / sql中的赋值操作是:=

CREATE TRIGGER C3
BEFORE UPDATE OF rate ON Magazines
FOR EACH ROW
WHEN(:NEW.rate < :OLD.rate*0.75)
BEGIN
    IF :NEW.rate < 0 THEN
        :NEW.rate := 0;
        RAISE_APPLICATION_ERROR(-20003, 'Rate should never be below 0.');
    ELSE
        :NEW.rate := :OLD.rate*0.75;
END;

答案 1 :(得分:0)

您首先需要仅从WHEN子句中删除冒号。然后,您还需要在等号前面加上冒号,以便在触发器主体中进行赋值。

CREATE TRIGGER C3
BEFORE UPDATE OF rate ON Magazines
FOR EACH ROW
WHEN(NEW.rate < OLD.rate*0.75)
BEGIN
    IF :NEW.rate < 0 THEN
        :NEW.rate := 0;
        RAISE_APPLICATION_ERROR(-20003, 'Rate should never be below 0.');
    ELSE
        :NEW.rate := :OLD.rate*0.75;
END;
/

根据documentation

  

在简单触发器的trigger_body或复合触发器的tps_body中,关联名称是绑定变量的占位符。使用以下语法引用伪记录的字段:

     

:pseudorecord_name.field_name

     

在条件触发器的WHEN子句中,关联名称不是绑定变量的占位符。因此,请使用前面的语法省略冒号。