ORA-04076: 无效的 NEW 或 OLD 规范 - PL/SQL - Oracle 触发器

Posted

技术标签:

【中文标题】ORA-04076: 无效的 NEW 或 OLD 规范 - PL/SQL - Oracle 触发器【英文标题】:ORA-04076: invalid NEW or OLD specification - PL/SQL - Oracle Trigger 【发布时间】:2013-11-27 15:33:13 【问题描述】:

我正在尝试编写这个触发器:

CREATE OR REPLACE TRIGGER ManageCall
AFTER INSERT 
ON STATE_CHANGE
FOR EACH ROW
WHEN (ChangeType='C')
DECLARE
x_coord NUMBER;
y_coord NUMBER;
BEGIN
    SELECT X, Y INTO x_coord, y_coord
    FROM TELEPHONE
    WHERE PHONENO = :NEW.PHONENO;
END;

指的是这些表:

TELEPHONE
PHONENO (CHAR) 
X (NUMBER)
Y (NUMBER)
PHONESTATE (CHAR)

STATE_CHANGE
CHANGEID (NUMBER)
TIMESTAMP (DATE)
PHONENO (CHAR)
X (NUMBER)
Y (NUMBER)
CHANGETYPE (CHAR)

我认为以正确的方式使用 :NEW 但我收到此消息:

ORA-04076: invalid NEW or OLD specification

谁能解释我哪里做错了。

非常感谢。

【问题讨论】:

【参考方案1】:

每次引用插入的列时,都必须使用:NEW:OLD

CREATE OR REPLACE TRIGGER ManageCall
    AFTER INSERT 
    ON STATE_CHANGE
    FOR EACH ROW
    DECLARE
    x_coord NUMBER;
    y_coord NUMBER;
    BEGIN
    IF :NEW.ChangeType='C' THEN
        SELECT X, Y INTO x_coord, y_coord
        FROM TELEPHONE t
        WHERE t.PHONENO = :NEW.PHONENO;
    END IF;
    END;

当您使用WHEN-clause 时,您不能使用 NEW 作为绑定变量,如here 所述(搜索“WHEN 子句”):

在 WHEN 子句中指定的 NEW 和 OLD 关键字不被视为绑定变量,因此前面没有冒号 (:)。但是,在除 WHEN 子句之外的所有引用中,您必须在 NEW 和 OLD 之前使用冒号。

因此以下内容也应该起作用:

CREATE OR REPLACE TRIGGER ManageCall
    AFTER INSERT 
    ON STATE_CHANGE
    FOR EACH ROW
    WHEN (NEW.ChangeType='C')
    DECLARE
    x_coord NUMBER;
    y_coord NUMBER;
    BEGIN
        SELECT X, Y INTO x_coord, y_coord
        FROM TELEPHONE
        WHERE PHONENO = :NEW.PHONENO;
    END;

【讨论】:

非常感谢。有用。但只是另一个我不明白的问题,因为我可以在 WHEN 中使用 .NEW(在 DECLARE 之前)。你能解释一下吗?非常感谢你很有用

以上是关于ORA-04076: 无效的 NEW 或 OLD 规范 - PL/SQL - Oracle 触发器的主要内容,如果未能解决你的问题,请参考以下文章

SQL减去两列给出错误-数据类型的运算符无效。运算符等于减法,类型等于nvarchar

dplyr 重命名 - 错误:`new_name` = old_name 必须是符号或字符串,而不是公式

ORA-04082: 表级触发器中不允许使用 NEW 或 OLD 引用

一个小知识点

PLSQL :NEW 和 :OLD

触发器 new和old before和after