【问题标题】:Wrong use of bind variable in WHEN of a trigger在触发器的 WHEN 中错误使用绑定变量
【发布时间】:2019-09-16 11:07:13
【问题描述】:

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

我试图在NEWOLD 之前删除:,但它却给了我另一个编译器错误。

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

【问题讨论】:

  • 添加缺少的END IF; 会发生什么情况?
  • 与没有 END IF 的错误相同; :(

标签: sql oracle triggers sqlplus


【解决方案1】:

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;

【讨论】:

  • 它仍然给我Wrong use of bind variable in WHEN of the trigger的错误:(
【解决方案2】:

您首先只需要从 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 子句中,相关名称不是绑定变量的占位符。因此,省略前面语法中的冒号。

【讨论】:

    猜你喜欢
    • 2012-11-04
    • 2021-09-20
    • 2017-08-11
    • 2013-02-06
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多