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



我在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;
/

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

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

有什么想法吗?多谢!

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;

您首先需要仅从 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;
/

根据文档:

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

:p seudorecord_name.field_name

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

最新更新