2014-11-14 31 views
0

這是產生錯誤代碼:Oracle觸發器:遇到符號「;」在需要下列之一時:如果

create or replace trigger "T4" 
AFTER 
update of "VALORE" on "OFFERTA" 
for each row 

DECLARE 
    cs Inserzione.PrezzoF%TYPE; 

BEGIN 
    SELECT I.PrezzoF INTO cs 
    FROM Inserzione I JOIN Offerta O ON I.Codice = O.Codice 
    WHERE O.Codice = :old.Codice; 

    IF (cs!=NULL AND new.Valore >= cs) THEN 
     UPDATE Inserzione 
     SET Stato = 'OFF'; 
    ENDIF; 
END;​ 

我不明白爲什麼,因爲它似乎是正確的。 錯誤是:13 4 PLS-00103:遇到符號「;」當期待以下其中一項時:如果

+4

使用END IF;而不是ENDIF; – Multisync 2014-11-14 16:05:36

+0

非常感謝你!!!!!!!! – user3182783 2014-11-14 16:07:32

回答

1

有幾個語法錯誤。

正如@Multisync在評論中指出的那樣,拋出錯誤的那個ENDIF應該是END IF

除此之外,還有其他一些問題。

  1. new.Valore應該是:new.Valore - 在:new:old pseudorecords需要用冒號前綴。
  2. cs!=NULL將始終返回FALSE即使cs實際上是NULL(從技術上說,它將始終返回「未知」,將被解釋爲false)。如果您想查看cs是否爲NULL,則需要使用cs IS NOT NULL
  3. 我強烈下注,您的UPDATE聲明缺少WHERE條款 - 我不相信您真的想要更新Inserzione表的每一行。最有可能的是,你需要添加WHERE codice = :old.codice

更新UPDATE

UPDATE Inserzione i 
    SET Stato = 'OFF' 
WHERE i.codice = :old.codice; 
  • 則可以從觸發器是在連續級觸發器定義的表一般不SELECT。這通常會引起變異表異常。我懷疑你的SELECT聲明中加入offerta是不需要的。你可能只是想要像
  • 更新SELECT

    SELECT i.prezzoF 
        INTO cs 
        FROM inserzione i 
    WHERE i.codie = :old.codice; 
    
    +0

    非常感謝!真! – user3182783 2014-11-14 16:50:28

    相關問題