我有一个触发器,其中我使用的是一个merge子句,触发器中没有错误但是当在该表上完成插入后触发器被触发,insert语句抛出ora-38104columns在on子句中引用不能在emp_id列上更新
这是合并声明
MERGE INTO stg_ta_payroll
USING
(select :NEW.ID_TM_ENR ID_TM_ENR, to_number(:NEW.ID_STR_RT) ID_STR_RT, :NEW.ID_EM ID_EM,
nvl(TO_NUMBER(TO_CHAR(:NEW.TS_EM_TM_IN,'YYMMDD')),0) V_TA_DATE,
V_SESSION_NO V_SESSION_NO,
:NEW.TS_EM_TM_IN TS_EM_TM_IN, :NEW.TS_EM_TM_OUT TS_EM_TM_OUT,
DECODE(:NEW.TY_TM,'0',nvl(to_char(:NEW.TS_EM_TM_IN,'HH24MI'),'0000'),' ') V_TIME_IN,
DECODE(:NEW.TY_TM,'0',nvl(to_char(:NEW.TS_EM_TM_OUT,'HH24MI'),'0000'),' ') V_TIME_OUT,
V_MGR_OVRD V_MGR_OVRD,
:NEW.ID_MGR ID_MGR,DECODE(:NEW.TY_TM,'XX','9',:NEW.TY_TM) TY_TM,
decode(:NEW.TY_TM,'0',:NEW.OTHER_HRS_STR ,(NVL((:OLD.OTHER_HRS_STR),0)+NVL((:NEW.OTHER_HRS_STR),0)))OTHER_HRS_STR,
-- V_OTHER_HRS_STR V_OTHER_HRS_STR,
V_AREA V_AREA, V_ASSC_NAME V_ASSC_NAME, V_MISC_WAGES_DESC V_MISC_WAGES_DESC, V_SHRT_STR_NAME V_SHRT_STR_NAME,
(:NEW.HRS_STR + :NEW.OTHER_HRS_STR) TOT_HRS from dual) STG
ON (TIME_ENT_ID=STG.ID_TM_ENR AND to_number(STR_ID)=to_number(STG.ID_STR_RT) AND EMP_ID=STG.ID_EM)
WHEN MATCHED THEN
UPDATE SET
STATUS = null,
EMP_ID = STG.ID_EM,
TA_DATE = STG.V_TA_DATE,
--SESSION_NO = STG.V_SESSION_NO,
TIME_IN = STG.V_TIME_IN,
TIME_OUT = STG.V_TIME_OUT,
MGR_OVERRIDE = STG.V_MGR_OVRD,
MGR_EMP_NO = STG.ID_MGR,
MISC_WAGES_CODE = STG.TY_TM,
MISC_WAGES_HRS = STG.OTHER_HRS_STR,
AREA = STG.V_AREA,
ASSOCIATE_NAME = STG.V_ASSC_NAME,
MISC_WAGES_DESC = STG.V_MISC_WAGES_DESC,
SHRT_STR_NAME = STG.V_SHRT_STR_NAME,
HRS = STG.TOT_HRS,
STG_OSB_PROCESS_DATE = null
答案 0 :(得分:0)
您的ON
条款包含AND EMP_ID=STG.ID_EM
,当您获得匹配时,他们就会设置EMP_ID = STG.ID_EM
,这无效。您已经知道这两个值是相同的,因此将列设置为其当前值没有意义。通常它只是毫无意义,但在这里它会导致ORA-38104错误,因为你不能将任何ON
子句列设置为任何东西,甚至本身。
删除SET
的那一部分,因为除了生成错误之外它没有做任何事情。