混淆了如何在plsql oracle中使用old + new

时间:2014-04-25 11:48:08

标签: sql oracle plsql

我有一个要求,我必须根据相同的日期,相同的原因代码和相同的员工ID来总结员工工作时间。我有一个大约250行的整个触发器我不是在写一个完整的触发器我只是编写了要进行更改的合并条款

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,
                   :NEW.OTHER_HRS_STR 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
            AND TA_DATE = STG.V_TA_DATE
            AND MISC_WAGES_CODE = STG.TY_TM)
WHEN MATCHED
THEN
   UPDATE SET
      STATUS = NULL,
      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_HRS =
         (  (NVL ( (:OLD.OTHER_HRS_STR), 0))
          + (NVL ( (:NEW.OTHER_HRS_STR), 0))),
      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
WHEN NOT MATCHED
THEN
   INSERT     (TIME_ENT_ID,
               STATUS,
               STR_ID,
               EMP_ID,
               TA_DATE,
               SESSION_NO,
               TIME_IN,
               TIME_OUT,
               MGR_OVERRIDE,
               MGR_EMP_NO,
               MISC_WAGES_CODE,
               MISC_WAGES_HRS,
               AREA,
               ASSOCIATE_NAME,
               MISC_WAGES_DESC,
               SHRT_STR_NAME,
               HRS,
               STG_LOAD_DATE,
               STG_EVENT_ID,
               STG_OSB_STATUS)
       VALUES (STG.ID_TM_ENR,
               NULL,
               STG.ID_STR_RT,
               STG.ID_EM,
               STG.V_TA_DATE,
               STG.V_SESSION_NO,
               STG.V_TIME_IN,
               STG.V_TIME_OUT,
               STG.V_MGR_OVRD,
               STG.ID_MGR,
               STG.TY_TM,
               STG.OTHER_HRS_STR,
               STG.V_AREA,
               STG.V_ASSC_NAME,
               STG.V_MISC_WAGES_DESC,
               STG.V_SHRT_STR_NAME,
               STG.TOT_HRS,
               SYSDATE,
               seq_stg_event_id.NEXTVAL,
               0);

COMMIT;

我必须总结基于相同日期(TA_DATE)的other_hrs_str列,相同的原因代码(TY_TM)和相同的员工ID(ID_EM)。我如何根据这些的other_hrs_str的旧+新值添加3个条件 任何人都可以帮忙。

1 个答案:

答案 0 :(得分:0)

如果你想要SUM()的东西,这需要GROUP BY 这是一个限制:输出中的列可以是GROUP BY中的列,也可以是某些聚合函数(SUM,COUNT等)

您可以通过分为两部分来避免查询:

  1. 键列+ sum()

  2. 键列+其他列

  3. 然后你只需要根据密钥加入这2个查询。

    :OLD和:NEW在触发触发器的语句之前和之后包含2个相同的版本。这意味着如果您需要对一条记录中不可用的内容求和,则需要编写SELECT语句来获取该信息。

    但是,请注意Mutating-Table Restriction

    所以,我的建议是你的SUM()来自触发触发器的同一个表,在INSERT / UPDATE语句中进行SUM计算(比它在新记录中可用)。

    您目前的问题是什么?