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 必须是符号或字符串,而不是公式