【问题标题】:ORA-04076: invalid NEW or OLD specification - PL/SQL - Oracle TriggerORA-04076: 无效的 NEW 或 OLD 规范 - PL/SQL - Oracle 触发器
【发布时间】: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

谁能解释我哪里做错了。

非常感谢。

【问题讨论】:

    标签: oracle plsql triggers


    【解决方案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 之前)。你能解释一下吗?非常感谢你很有用
    猜你喜欢
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    相关资源
    最近更新 更多