2013-11-27 40 views
0

我試圖寫這個觸發器:ORA-04076:無效的新的或舊規範 - PL/SQL - Oracle觸發器

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 

有人可以解釋我在哪裏我犯了一個錯誤。

非常感謝。

回答

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 -clause,您不能使用新的綁定變量的聲明here(搜索「WHEN條款」):

新老關鍵字,當在WHEN子句中指定時,不被視爲綁定變量,所以不會以冒號(:)開頭。但是,除了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; 
+0

非常感謝你。有用。但只是另一個我不明白的問題,因爲我可以在WHEN(DECLARE之前)中使用.NEW。你能解釋一下嗎?非常感謝你,你一直很有用 – user2510406

+0

我編輯了我的答案,以澄清這一點。 – Armunin

+0

非常感謝 – user2510406