ORA-04076:无效的新旧规范 - PL / SQL - Oracle触发器

时间:2013-11-27 15:33:13

标签: oracle plsql triggers

我正在尝试编写此触发器:

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)

我认为可以使用:正确的方式新,但我收到了这条消息:

ORA-04076: invalid NEW or OLD specification

有人可以解释我在哪里犯了错误。

非常感谢你。

1 个答案:

答案 0 :(得分:3)

每次引用插入的列时,都必须使用: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 - 子句时,您不能将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;