我正在尝试编写此触发器:
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
有人可以解释我在哪里犯了错误。
非常感谢你。
答案 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;