以下这个SQL我运行之后,报qryData:内部错误($172)
MERGE INTO dlvr_date_mng_hdr ddh
USING(
--SQL[5-1-1]
                 SELECT
                       iv.dlvr_date_mng_num      dlvr_date_mng_num
                     , NVL(iv.dlvr_dely_day, 0)  dlvr_dely_day
                     , NVL(iv.dlvr_dely_qty, 0)  dlvr_dely_qty
                     , NVL(gdm.gnrl_cd, '0001')  gnrl_cd
                 FROM 
                     (
                     --SQL[5-1-2]
                     SELECT 
                           dpw.dlvr_date_mng_num     dlvr_date_mng_num
                         , dpw.dlvr_dely_day         dlvr_dely_day
                         , dpw.dlvr_dely_qty         dlvr_dely_qty
                         , dpw.dd_mng_mlstn_actl_flg dd_mng_mlstn_actl_flg
                     FROM 
                         dlvr_date_mng_prd_wk dpw
                     WHERE
                             dpw.dd_mng_mlstn_prcs_trgt_flg = 'Y'
                         AND dpw.delete_flag                = 'N'
                     UNION ALL
                     SELECT 
                           dlvr_date_mng_num      dlvr_date_mng_num
                         , dlvr_dely_day          dlvr_dely_day
                         , dlvr_dely_qty          dlvr_dely_qty
                         , dd_mng_mlstn_actl_flg  dd_mng_mlstn_actl_flg
                     FROM 
                         (
                         --SQL[5-1-3]
                          SELECT 
                                dtw.dlvr_date_mng_num  dlvr_date_mng_num
                              , MAX(dtw.dlvr_dely_day) dlvr_dely_day
                              , SUM(dtw.dlvr_dely_qty) dlvr_dely_qty
                              , DECODE(COUNT(DISTINCT dtw.dd_mng_mlstn_actl_flg ), 2, 'N', MIN(dtw.dd_mng_mlstn_actl_flg) ) dd_mng_mlstn_actl_flg
                         FROM 
                             dlvr_date_mng_trnpt_wk dtw
                         WHERE 
                                 dtw.dd_mng_mlstn_prcs_trgt_flg = 'Y'
                             AND dtw.delete_flag                = 'N'
                         GROUP BY
                             dtw.dlvr_date_mng_num
                         )
                     ) iv
                     , gnrl_cd_dtl_m gdm
                     , dlvr_date_mng_hdr dmh
                     , gnrl_cd_dtl_m gdmw
                 WHERE
                         iv.dlvr_date_mng_num = dmh.dlvr_date_mng_num
                     AND gdm.delete_flag      = 'N'
                     AND gdm.gnrl_cd_type_cd  = 'PRD0018'
                     AND gdm.gnrl_cd_atrbt1   = 'Y'
                     AND gdm.gnrl_cd_atrbt2   = iv.dd_mng_mlstn_actl_flg
                     AND (gdm.gnrl_cd_atrbt3 IS NULL 
                          OR gdm.gnrl_cd_atrbt3   = NVL(gdmw.gnrl_cd_atrbt3, 'N'))
                     AND gdmw.delete_flag     = 'N'
                     AND gdmw.gnrl_cd_type_cd = 'PRD0018'
                     AND gdmw.gnrl_cd         = dmh.dlvr_dely_alrt_type_cd
) ddmh 
 ON(
                ddh.dlvr_date_mng_num = ddmh.dlvr_date_mng_num
            AND ddh.glbl_bu_cd             = '002'
            AND ddh.delete_flag            = 'N'
            AND ddh.dlvr_date_mng_updt_flg = 'Y'
   )
 WHEN MATCHED THEN
            UPDATE
            SET 
              ddh.dlvr_dely_day = ddmh.dlvr_dely_day
            , ddh.dlvr_dely_qty = ddmh.dlvr_dely_qty
            , ddh.dlvr_dely_alrt_type_cd = ddmh.gnrl_cd
            , ddh.update_user_id = 'SYS'
            , ddh.update_date = SYSDATE;

解决方案 »

  1.   

    子查询执行没有问题。
    除了最后的update,单独执行都没有问题
      

  2.   

    直接执行就报qryData:内部错误($172)
      

  3.   


                     SELECT
                           iv.dlvr_date_mng_num      dlvr_date_mng_num
                         , NVL(iv.dlvr_dely_day, 0)  dlvr_dely_day
                         , NVL(iv.dlvr_dely_qty, 0)  dlvr_dely_qty
                         , NVL(gdm.gnrl_cd, '0001')  gnrl_cd
                     FROM 
                         (
                         --SQL[5-1-2]
                         SELECT 
                               dpw.dlvr_date_mng_num     dlvr_date_mng_num
                             , dpw.dlvr_dely_day         dlvr_dely_day
                             , dpw.dlvr_dely_qty         dlvr_dely_qty
                             , dpw.dd_mng_mlstn_actl_flg dd_mng_mlstn_actl_flg
                         FROM 
                             dlvr_date_mng_prd_wk dpw
                         WHERE
                                 dpw.dd_mng_mlstn_prcs_trgt_flg = 'Y'
                             AND dpw.delete_flag                = 'N'
                         UNION ALL
                         SELECT 
                               dlvr_date_mng_num      dlvr_date_mng_num
                             , dlvr_dely_day          dlvr_dely_day
                             , dlvr_dely_qty          dlvr_dely_qty
                             , dd_mng_mlstn_actl_flg  dd_mng_mlstn_actl_flg
                         FROM 
                             (
                             --SQL[5-1-3]
                              SELECT 
                                    dtw.dlvr_date_mng_num  dlvr_date_mng_num
                                  , MAX(dtw.dlvr_dely_day) dlvr_dely_day
                                  , SUM(dtw.dlvr_dely_qty) dlvr_dely_qty
                                  , DECODE(COUNT(DISTINCT dtw.dd_mng_mlstn_actl_flg ), 2, 'N', MIN(dtw.dd_mng_mlstn_actl_flg) ) dd_mng_mlstn_actl_flg
                             FROM 
                                 dlvr_date_mng_trnpt_wk dtw
                             WHERE 
                                     dtw.dd_mng_mlstn_prcs_trgt_flg = 'Y'
                                 AND dtw.delete_flag                = 'N'
                             GROUP BY
                                 dtw.dlvr_date_mng_num
                             )
                         ) iv
                         , gnrl_cd_dtl_m gdm
                         , dlvr_date_mng_hdr dmh
                         , gnrl_cd_dtl_m gdmw
                     WHERE
                             iv.dlvr_date_mng_num = dmh.dlvr_date_mng_num
                         AND gdm.delete_flag      = 'N'
                         AND gdm.gnrl_cd_type_cd  = 'PRD0018'
                         AND gdm.gnrl_cd_atrbt1   = 'Y'
                         AND gdm.gnrl_cd_atrbt2   = iv.dd_mng_mlstn_actl_flg
                         AND (gdm.gnrl_cd_atrbt3 IS NULL 
                              OR gdm.gnrl_cd_atrbt3   = NVL(gdmw.gnrl_cd_atrbt3, 'N'))
                         AND gdmw.delete_flag     = 'N'
                         AND gdmw.gnrl_cd_type_cd = 'PRD0018'
                         AND gdmw.gnrl_cd         = dmh.dlvr_dely_alrt_type_cd这个选出来是什么,看下你选出的结果,要不加个and rownum=1看下你的结果?试试用一条记录(AND gdmw.gnrl_cd= dmh.dlvr_dely_alrt_type_cd and rownum=1
    )去执行此脚本,看下会不会出问题,估计是你数据的问题脚本看不出来问题,merge into如果源存在相同数据行时会有问题的,但报的错应不是这个
      

  4.   


    查出来的结果只有一条记录。
    我用PL/SQL Developer执行我的语句就没有报错,但是用OB来运行就出我开始的错误,求解。