我在尝试编译此触发器时遇到以下错误。专栏" 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;
谢谢,
史蒂芬
答案 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';
。