Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
困惑于如何使用旧+;plsqloracle中的新特性_Sql_Oracle_Plsql - Fatal编程技术网

困惑于如何使用旧+;plsqloracle中的新特性

困惑于如何使用旧+;plsqloracle中的新特性,sql,oracle,plsql,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

我有一个要求,我必须根据相同的日期、相同的原因代码和相同的员工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)、相同的原因代码(TY_TM)和相同的员工id(id_EM)汇总其他_hrs_str列。在这3个条件下,如何根据其他_hrs_str的旧值+新值进行添加 有谁能帮忙吗。

如果你想算数,这需要分组 这里有一个限制:输出中的列可以是GROUPBY中的列,也可以是一些聚合函数(SUM、COUNT等)

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

  • 键列+和()

  • 键列+其他列

  • 然后,您只需根据密钥加入这2个查询

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

    但是,请注意

    所以,我的建议是,如果SUM()来自触发触发器的同一个表,则在INSERT/UPDATE语句中进行SUM计算(在:NEW record中可用)


    你目前的问题是什么

    您能否尝试格式化查询以便有机会理解它?