【问题标题】:ora-38104columns referenced in on clause cannot be updatedora-38104 on 子句中引用的列无法更新
【发布时间】:2014-06-14 01:22:40
【问题描述】:

我有一个触发器,其中我正在使用合并子句,触发器中没有错误,但是当在该表上完成插入后触发触发器时,插入语句会抛出 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

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

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

    只需删除 SET 的那部分,因为它除了生成错误之外什么都不做。

    【讨论】:

    • 谢谢@Alex Poole 我用谷歌搜索它并找到答案我从更新子句中删除它并在 ON 子句中使用它现在我也可以插入记录,但现在问题出现在解码语句,我根据此条件添加旧值和新值不等于零,你能帮忙吗,我真的很感激你
    • @saniyamapari - 在这里提出问题然后寻找答案肯定是错误的;如果你自己找不到答案,你应该问一个问题吗?尽管无论如何这里的错误都很清楚。我不明白您的新问题-您提到了解码,但随后显示了您的ON 条件。你有几个解码;不确定您是否从其中获得了错误的值(如果没有架构和数据,这将很难诊断),还是错误。无论哪种方式,如果您无法弄清楚(在搜索之后!)它应该是一个新问题。
    • 抱歉,大约 15 分钟没有回复,而且很紧急,所以我不得不用谷歌搜索并解决任何方法 thanx @Alex Poole
    猜你喜欢
    • 2011-08-19
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    相关资源
    最近更新 更多