触发器中的“Where”子句出错

时间:2014-03-31 14:27:15

标签: sql oracle triggers oracle-apex

我在尝试编译此触发器时遇到以下错误。专栏" POD"在我的OEF_ITV_NDN表中,但我还没有使用触发器来了解为什么它说它是一个无效的标识符。

  
    

编译失败,第77行(09:19:41)与编译错误关联的行号与第一个BEGIN语句相关。这只会影响数据库触发器的编译。     PL / SQL:ORA-00904:" POD":无效标识符编译失败,第5行(09:19:41)与编译错误关联的行号与第一个BEGIN语句相关。这只会影响数据库触发器的编译。     PL / SQL:忽略SQL语句

  
create or replace TRIGGER "OEF_ITV_NDN_TRU" BEFORE  
  UPDATE ON OEF_ITV_NDN FOR EACH ROW  
BEGIN  
  :NEW.UPDATED_DATE := SYSDATE;  
  :NEW.UPDATED_BY := NVL(V('P1_USER_ID'),USER);
  BEGIN   
    SELECT  
    DECODE(:OLD.CHY_ATD_DATE, :NEW.CHY_ATD_DATE, DECODE( <br>
            :OLD.CHY_ETD_DATE, :NEW.CHY_ETD_DATE, DECODE(<br>
            :OLD.CHY_ATA_DATE, :NEW.CHY_ATA_DATE, DECODE(<br>
            :OLD.CHY_ETA_DATE, :NEW.CHY_ETA_DATE, DECODE(<br>
            :OLD.DLVRY_ATA_DATE, :NEW.DLVRY_ATA_DATE, DECODE(<br>
            :OLD.DLVRY_ETA_DATE,:NEW.DLVRY_ETA_DATE,DECODE(<br>
            :OLD.AVAIL_FOR_DLVRY_DATE,:NEW.AVAIL_FOR_DLVRY_DATE,DECODE(<br>
            :OLD.HAIRATON_ATD_DATE, :NEW.HAIRATON_ATD_DATE, DECODE(<br>
            :OLD.HAIRATON_ETD_DATE, :NEW.HAIRATON_ETD_DATE, DECODE(<br>
            :OLD.HAIRATON_ATA_DATE, :NEW.HAIRATON_ATA_DATE, DECODE(<br>
            :OLD.HAIRATON_ETA_DATE, :NEW.HAIRATON_ETA_DATE, DECODE(<br>
            :OLD.TERMEZ_ATA_DATE, :NEW.TERMEZ_ATA_DATE, DECODE(<br>
            :OLD.TERMEZ_ETA_DATE, :NEW.TERMEZ_ETA_DATE, DECODE(<br>
            :OLD.UZ_BORDER_ATA_DATE, :NEW.UZ_BORDER_ATA_DATE, DECODE(<br>
            :OLD.UZ_BORDER_ETA_DATE, :NEW.UZ_BORDER_ETA_DATE, DECODE(<br>
            :OLD.SHER_KHAN_ATD_DATE, :NEW.SHER_KHAN_ATD_DATE, DECODE(<br>
            :OLD.SHER_KHAN_ETD_DATE, :NEW.SHER_KHAN_ETD_DATE, DECODE(<br>
            :OLD.SHER_KHAN_ATA_DATE, :NEW.SHER_KHAN_ATA_DATE, DECODE(<br>
            :OLD.SHER_KHAN_ETA_DATE, :NEW.SHER_KHAN_ETA_DATE, DECODE(<br>
            :OLD.TJ_BORDER_ATA_DATE, :NEW.TJ_BORDER_ATA_DATE, DECODE(<br>
            :OLD.TJ_BORDER_ETA_DATE, :NEW.TJ_BORDER_ETA_DATE, DECODE(<br>
            :OLD.KG_BORDER_ATA_DATE, :NEW.KG_BORDER_ATA_DATE, DECODE(<br>
            :OLD.KG_BORDER_ETA_DATE, :NEW.KG_BORDER_ETA_DATE, DECODE(<br>
            :OLD.KZ_BORDER_ATA_DATE, :NEW.KZ_BORDER_ATA_DATE, DECODE(<br>
            :OLD.KZ_BORDER_ETA_DATE, :NEW.KZ_BORDER_ETA_DATE, DECODE(<br>
            :OLD.RU_BORDER_ATA_DATE, :NEW.RU_BORDER_ATA_DATE, DECODE(<br>
            :OLD.RU_BORDER_ETA_DATE, :NEW.RU_BORDER_ETA_DATE, DECODE(<br>
            :OLD.BY_BORDER_ATA_DATE, :NEW.BY_BORDER_ATA_DATE, DECODE(<br>
            :OLD.BY_BORDER_ETA_DATE, :NEW.BY_BORDER_ETA_DATE, DECODE(<br>
            :OLD.POD_OUTGATE_DATE, :NEW.POD_OUTGATE_DATE, DECODE(<br>
            :OLD.POD_ATA_DATE, :NEW.POD_ATA_DATE, DECODE(<br>
            :OLD.POD_ETA_DATE, :NEW.POD_ETA_DATE, DECODE(<br>
            :OLD.POE_ATD_DATE, :NEW.POE_ATD_DATE, DECODE(<br>
            :OLD.POE_ETD_DATE, :NEW.POE_ETD_DATE, DECODE(<br>
            :OLD.RDD, :NEW.RDD, :OLD.MAX_EVENT,'RDD'),<br>
            'ETD POE'),<br>
            'ATD POE'),<br>
            'ETA POD'),<br>
            'ATA POD'),<br>
            'Outgate JN4'),<br>
            'ETA BY Border'),<br>
            'ATA BY Border'),<br>
            'ETA RU Border'),<br>
            'ATA RU Border'),<br>
            'ETA KZ Border'),<br>
            'ATA KZ Border'),<br>
            'ETA KG Border'),<br>
            'ATA KG Border'),<br>
            'ETA TJ Border'),<br>
            'ATA TJ Border'),<br>
            'ETA Sher Khan'),<br>
            'ATA Sher Khan'),<br>
            'ETD Sher Khan'),<br>
            'ATD Sher Khan'),<br>
            'ETA UZ Border'),<br>
            'ATA UZ Border'),<br>
            'ETA Termez UZ'),<br>
            'ATA Termez UZ'),<br>
            'ETA Hairaton AF'),<br>
            'ATA Hairaton AF'),<br>
            'ETD Hairaton AF'),<br>
            'ATD Hairaton AF'),<br>
            'Avail For Dlvry at FOB'),<br>
            'ETA Delivery'),<br>
            'ATA Delivery'),<br>
            'ETA CHY'),<br>
            'ATA CHY'),<br>
            'ETD CHY'),<br>
            'ATD CHY')<br>
    INTO :NEW.MAX_EVENT  
    FROM DUAL<br>
    WHERE OEF_ITV_NDN.POD = 'JN4';

    EXCEPTION WHEN OTHERS THEN  
    :NEW.MAX_EVENT := 'ERRORED';  
  END;  
END;

谢谢,
史蒂芬

2 个答案:

答案 0 :(得分:2)

错误似乎是您从dual表中查询,但尝试引用OEF_ITV_NON表中的列。

 FROM DUAL
WHERE OEF_ITV_NDN.POD = 'JN4';

无效。如果您的查询针对dual表,则只能引用dual表中的列。如果您的查询针对oef_itv_non表,则可以引用pod列。但是,这可能会返回多行而不是您期望的1行。并且它将抛出一个变异表异常,因为触发器定义的表就是这样。

对我来说,WHERE条款应该为你完成的事情并不明显,因此很难猜出你真正想要的是什么。我最好的猜测是,如果:new.max_event列的值为:new.pod IF`声明

,您只想为JN4'. If that's the case, use an列分配一个值
IF( :new.pod = 'JN4' )
THEN
  :new.max_event := DECODE( ...
END IF;

您的整个decode声明也相当令人困惑。我必须弄清楚实际上想要完成什么才能弄清楚如何重写它。但是,如果没有嵌套的decode语句使用带有多个参数的单个decode或使用标准case,您似乎很有可能做任何事情。言。

也许你想要

IF( :new.pod = 'JN4' )
THEN
  :new.max_event := (CASE WHEN :OLD.CHY_ATD_DATE != :NEW.CHY_ATD_DATE
                          THEN 'ATD CHY'
                          WHEN :OLD.CHY_ETD_DATE != :NEW.CHY_ETD_DATE
                          THEN 'ETD CHY'
                          ...
                      END);
END IF;

答案 1 :(得分:0)

我认为这只是一个问题:您在OEF_ITV_NDN上有一个触发器,因此您的where子句WHERE OEF_ITV_NDN.POD = 'JN4';无效:只需将其替换为WHERE :NWE.POD = 'JN4';