on子句中引用的ora-38104columns无法更新

时间:2014-04-28 13:12:01

标签: sql oracle

我有一个触发器,其中我使用的是一个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

1 个答案:

答案 0 :(得分:0)

您的ON条款包含AND EMP_ID=STG.ID_EM,当您获得匹配时,他们就会设置EMP_ID = STG.ID_EM,这无效。您已经知道这两个值是相同的,因此将列设置为其当前值没有意义。通常它只是毫无意义,但在这里它会导致ORA-38104错误,因为你不能将任何ON子句列设置为任何东西,甚至本身。

删除SET的那一部分,因为除了生成错误之外它没有做任何事情。