2014-11-14 93 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

    相关问题