暂无图片
分享
文成
2019-01-22
ORA-00600: 内部错误代码, 参数: [kkogbro: no kkoaptyp], [2]

数据库中一个定时执行的存储过程报错,报错代码为

ORA-00600: 内部错误代码, 参数: [kkogbro: no kkoaptyp], [2]

这个存储过程之前一直无异常,在1月9日开始报错,程序没有更新,业务也没有变动。

报错的位置是一个merge语句,里面通过union all 包含了几个厂家的数据

实验发现,将其中两个厂家的union all注释,则不会报错,这两个厂家无数据(应该是一直没有数据)

原sql

 MERGE /*+ NO_MERGE(S) USE_HASH(D,S) */
      INTO DS_LTE_BUSY_CITY_D D
      USING (SELECT START_TIME,
                    CITY_ID,
                    (CASE
                      WHEN PRB_OCCU_MORNING = 0 THEN
                       TRUNC(V_DATE) + 10 / 24
                      ELSE
                       BUSY_TIME_MORNING
                    END) AS BUSY_TIME_MORNING,
                    (CASE
                      WHEN PRB_OCCU_EVENING = 0 THEN
                       TRUNC(V_DATE) + 21 / 24
                      ELSE
                       BUSY_TIME_EVENING
                    END) AS BUSY_TIME_EVENING,
                    (CASE
                      WHEN PRB_OCCU_DAY = 0 THEN
                       TRUNC(V_DATE) + 21 / 24
                      ELSE
                       BUSY_TIME_DAY
                    END) AS BUSY_TIME_DAY,
                    PRB_OCCU_MORNING,
                    PRB_OCCU_EVENING,
                    PRB_OCCU_DAY
               FROM (
                    --数据源
                    WITH V AS (SELECT START_TIME,
                                      CITY_ID,
                                      SUM(PRB_OCCU) AS PRB_OCCU
                                 FROM (select /*+FULL(TB0) FULL(TB1) USE_HASH(TB0,TB1)*/
                                              TB0.START_TIME,
                                              TB0.CITY_ID,
                                              Round(100 *
                                                    decode(Round(C373424611, 4),
                                                           0,
                                                           0.0,
                                                           Round(C373424610, 4) / Round(C373424611, 4)),
                                                    4) AS PRB_OCCU
                                         from DS_COUNTER_GROUP_ZTE_CM_L_4 TB0,
                                              DS_COUNTER_GROUP_ZTE_CM_L_3 TB1
                                        where (TB0.START_TIME >= V_DATE AND TB0.START_TIME < V_DATE + 1 AND
                                              TB1.START_TIME >= V_DATE AND TB1.START_TIME < V_DATE + 1 AND

                                              TB0.CITY_ID = TB1.CITY_ID AND
                                              TB0.START_TIME = TB1.START_TIME)
                                       union all
                                       select /*+FULL(TB0) FULL(TB1) USE_HASH(TB0,TB1)*/
                                              TB0.START_TIME,
                                              TB0.CITY_ID,
                                              Round(100 *
                                                    (decode(Round(CELL_TSUM_NSUM * 3600 * 1000 * 100, 4),
                                                            0,
                                                            0.0,
                                                            Round((C_12032_CUM), 4) /
                                                            Round(CELL_TSUM_NSUM * 3600 * 1000 * 100, 4))),
                                                    4) AS PRB_OCCU
                                         from DS_COUNTER_GROUP_ALU_CM_L_1 TB0,
                                              DS_COUNTER_GROUP_ALU_CM_L_4 TB1
                                        where (TB0.START_TIME >= V_DATE AND TB0.START_TIME < V_DATE + 1 AND
                                              TB1.START_TIME >= V_DATE AND TB1.START_TIME < V_DATE + 1 AND

                                              TB0.CITY_ID = TB1.CITY_ID AND
                                              TB0.START_TIME = TB1.START_TIME)
                                       union all
                                       select /*+FULL(TB0) FULL(TB1) USE_HASH(TB0,TB1)*/
                                              TB0.START_TIME,
                                              TB0.CITY_ID,
                                              Round(100 *
                                                    (decode(Round((M8001C216 / 4), 4),
                                                            0,
                                                            0.0,
                                                            Round((((M8011C51 / 60) / 60) / 1000), 4) /
                                                            Round((M8001C216 / 4), 4))),
                                                    4) AS PRB_OCCU
                                         from DS_COUNTER_GROUP_NK_CM_L_1 TB0,
                                              DS_COUNTER_GROUP_NK_CM_L_2 TB1
                                        where (TB0.START_TIME >= V_DATE AND TB0.START_TIME < V_DATE + 1 AND
                                              TB1.START_TIME >= V_DATE AND TB1.START_TIME < V_DATE + 1 AND

                                              TB0.CITY_ID = TB1.CITY_ID AND
                                              TB0.START_TIME = TB1.START_TIME)
                                       union all
                                       select /*+FULL(TB0) FULL(TB1) USE_HASH(TB0,TB1)*/
                                              TB0.START_TIME,
                                              TB0.CITY_ID,
                                              Round(100 * (decode(Round(COUNTER_1526728433, 4),
                                                                  0,
                                                                  0.0,
                                                                  Round(COUNTER_1526726740, 4) /
                                                                  Round(COUNTER_1526728433, 4))),
                                                    4) AS PRB_OCCU
                                         from DS_COUNTER_GROUP_HW_CM_L_1 TB0,
                                              DS_COUNTER_GROUP_HW_CM_L_2 TB1
                                        where (TB0.START_TIME >= V_DATE AND TB0.START_TIME < V_DATE + 1 AND
                                              TB1.START_TIME >= V_DATE AND TB1.START_TIME < V_DATE + 1 AND

                                              TB0.CITY_ID = TB1.CITY_ID AND
                                              TB0.START_TIME = TB1.START_TIME)
                                           UNION ALL
                                           SELECT /*+ full(t) */
                                              T.START_TIME,
                                              T.CITY_ID,
                                              Round(100 *
              (PMPRBUSEDDLDTCH + PMPRBUSEDDLBCCH + PMPRBUSEDDLPCCH +PMPRBUSEDDLSRBFIRSTTRANS * (1 + PMPRBUSEDDLRETRANS / PMPRBUSEDDLFIRSTTRANS))
                                        /PMPRBAVAILDL,
                                         4) AS PRB_OCCU
                                         FROM DS_COUNTER_GROUP_ERIC_CM_L_1 T
                                         WHERE START_TIME >= V_DATE
                                           AND START_TIME < V_DATE + 1
                                          )
                                GROUP BY START_TIME,
                                         CITY_ID)
                    --
                      SELECT V_DATE AS START_TIME,
                             CITY_ID,
                             MAX(BUSY_TIME_MORNING) AS BUSY_TIME_MORNING,
                             MAX(PRB_OCCU_MORNING) AS PRB_OCCU_MORNING,
                             MAX(BUSY_TIME_EVENING) AS BUSY_TIME_EVENING,
                             MAX(PRB_OCCU_EVENING) AS PRB_OCCU_EVENING,
                             (CASE
                               WHEN MAX(NVL(PRB_OCCU_MORNING, 0)) >= MAX(NVL(PRB_OCCU_EVENING, 0)) THEN
                                MAX(BUSY_TIME_MORNING)
                               ELSE
                                MAX(BUSY_TIME_EVENING)
                             END) AS BUSY_TIME_DAY,
                             MAX(CASE
                                   WHEN NVL(PRB_OCCU_MORNING, 0) >= NVL(PRB_OCCU_EVENING, 0) THEN
                                    PRB_OCCU_MORNING
                                   ELSE
                                    PRB_OCCU_EVENING
                                 END) AS PRB_OCCU_DAY
                        FROM (SELECT CITY_ID,
                                     FIRST_VALUE(START_TIME) OVER(PARTITION BY CITY_ID, TRUNC(START_TIME, 'DD') ORDER BY PRB_OCCU DESC NULLS LAST) AS BUSY_TIME_MORNING,
                                     FIRST_VALUE(PRB_OCCU) OVER(PARTITION BY CITY_ID, TRUNC(START_TIME, 'DD') ORDER BY PRB_OCCU DESC NULLS LAST) AS PRB_OCCU_MORNING,
                                     NULL AS BUSY_TIME_EVENING,
                                     NULL AS PRB_OCCU_EVENING
                                FROM V
                               WHERE START_TIME >= V_DATE
                                 AND START_TIME <= V_DATE + 11 / 24
                              UNION ALL
                              SELECT CITY_ID,
                                     NULL,
                                     NULL,
                                     FIRST_VALUE(START_TIME) OVER(PARTITION BY CITY_ID, TRUNC(START_TIME, 'DD') ORDER BY PRB_OCCU DESC NULLS LAST) AS BUSY_TIME_EVENING,
                                     FIRST_VALUE(PRB_OCCU) OVER(PARTITION BY CITY_ID, TRUNC(START_TIME, 'DD') ORDER BY PRB_OCCU DESC NULLS LAST) AS PRB_OCCU_EVENING
                                FROM V
                               WHERE START_TIME >= V_DATE + 12 / 24
                                 AND START_TIME < V_DATE + 1)
                       GROUP BY CITY_ID)
             ) S
      ON (D.START_TIME = S.START_TIME AND D.CITY_ID = S.CITY_ID AND D.START_TIME = V_DATE)
      WHEN MATCHED THEN
        UPDATE
           SET D.BUSY_TIME_MORNING5 = S.BUSY_TIME_MORNING,
               D.BUSY_TIME_EVENING5 = S.BUSY_TIME_EVENING,
               D.BUSY_TIME_DAY5     = S.BUSY_TIME_DAY,
               D.PRB_OCCU_MORNING5  = S.PRB_OCCU_MORNING,
               D.PRB_OCCU_EVENING5  = S.PRB_OCCU_EVENING,
               D.PRB_OCCU_DAY5      = S.PRB_OCCU_DAY;


修改后的sql

 MERGE /*+ NO_MERGE(S) USE_HASH(D,S) */
      INTO DS_LTE_BUSY_NEGROUP_D D
      USING (SELECT START_TIME,
                    GROUP_ID,
                    (CASE
                      WHEN PRB_OCCU_MORNING = 0 THEN
                       TRUNC(V_DATE) + 10 / 24
                      ELSE
                       BUSY_TIME_MORNING
                    END) AS BUSY_TIME_MORNING,
                    (CASE
                      WHEN PRB_OCCU_EVENING = 0 THEN
                       TRUNC(V_DATE) + 21 / 24
                      ELSE
                       BUSY_TIME_EVENING
                    END) AS BUSY_TIME_EVENING,
                    (CASE
                      WHEN PRB_OCCU_DAY = 0 THEN
                       TRUNC(V_DATE) + 21 / 24
                      ELSE
                       BUSY_TIME_DAY
                    END) AS BUSY_TIME_DAY,
                    PRB_OCCU_MORNING,
                    PRB_OCCU_EVENING,
                    PRB_OCCU_DAY
               FROM (
                    --数据源
                    WITH V AS (SELECT START_TIME,
                                      GROUP_ID,
                                      SUM(PRB_OCCU) AS PRB_OCCU
                                 FROM (select /*+FULL(TB0) FULL(TB1) USE_HASH(TB0,TB1)*/
                                              TB0.START_TIME,
                                              TB0.GROUP_ID,
                                              Round(100 *
                                                    decode(Round(C373424611, 4),
                                                           0,
                                                           0.0,
                                                           Round(C373424610, 4) / Round(C373424611, 4)),
                                                    4) AS PRB_OCCU
                                         from DS_COUNTER_GROUP_ZTE_CG_L_4 TB0,
                                              DS_COUNTER_GROUP_ZTE_CG_L_3 TB1
                                        where (TB0.START_TIME >= V_DATE AND TB0.START_TIME < V_DATE + 1 AND
                                              TB1.START_TIME >= V_DATE AND TB1.START_TIME < V_DATE + 1 AND

                                              TB0.GROUP_ID = TB1.GROUP_ID AND
                                              TB0.START_TIME = TB1.START_TIME)
                                     /*  union all
                                       select \*+FULL(TB0) FULL(TB1) USE_HASH(TB0,TB1)*\
                                              TB0.START_TIME,
                                              TB0.GROUP_ID,
                                              Round(100 *
                                                    (decode(Round(CELL_TSUM_NSUM * 3600 * 1000 * 100, 4),
                                                            0,
                                                            0.0,
                                                            Round((C_12032_CUM), 4) /
                                                            Round(CELL_TSUM_NSUM * 3600 * 1000 * 100, 4))),
                                                    4) AS PRB_OCCU
                                         from DS_COUNTER_GROUP_ALU_CG_L_1 TB0,
                                              DS_COUNTER_GROUP_ALU_CG_L_4 TB1
                                        where (TB0.START_TIME >= V_DATE AND TB0.START_TIME < V_DATE + 1 AND
                                              TB1.START_TIME >= V_DATE AND TB1.START_TIME < V_DATE + 1 AND

                                              TB0.GROUP_ID = TB1.GROUP_ID AND
                                              TB0.START_TIME = TB1.START_TIME)
                                       union all
                                       select \*+FULL(TB0) FULL(TB1) USE_HASH(TB0,TB1)*\
                                              TB0.START_TIME,
                                              TB0.GROUP_ID,
                                              Round(100 *
                                                    (decode(Round((M8001C216 / 4), 4),
                                                            0,
                                                            0.0,
                                                            Round((((M8011C51 / 60) / 60) / 1000), 4) /
                                                            Round((M8001C216 / 4), 4))),
                                                    4) AS PRB_OCCU
                                         from DS_COUNTER_GROUP_NK_CG_L_1 TB0,
                                              DS_COUNTER_GROUP_NK_CG_L_2 TB1
                                        where (TB0.START_TIME >= V_DATE AND TB0.START_TIME < V_DATE + 1 AND
                                              TB1.START_TIME >= V_DATE AND TB1.START_TIME < V_DATE + 1 AND

                                              TB0.GROUP_ID = TB1.GROUP_ID AND
                                              TB0.START_TIME = TB1.START_TIME)*/
                                       union all
                                       select /*+FULL(TB0) FULL(TB1) USE_HASH(TB0,TB1)*/
                                              TB0.START_TIME,
                                              TB0.GROUP_ID,
                                              Round(100 * (decode(Round(COUNTER_1526728433, 4),
                                                                  0,
                                                                  0.0,
                                                                  Round(COUNTER_1526726740, 4) /
                                                                  Round(COUNTER_1526728433, 4))),
                                                    4) AS PRB_OCCU
                                         from DS_COUNTER_GROUP_HW_CG_L_1 TB0,
                                              DS_COUNTER_GROUP_HW_CG_L_2 TB1
                                        where (TB0.START_TIME >= V_DATE AND TB0.START_TIME < V_DATE + 1 AND
                                              TB1.START_TIME >= V_DATE AND TB1.START_TIME < V_DATE + 1 AND

                                              TB0.GROUP_ID = TB1.GROUP_ID AND
                                              TB0.START_TIME = TB1.START_TIME)
                                        UNION ALL
                                        SELECT /*+ full(t) */
                                              T.START_TIME,
                                              T.GROUP_ID,
                                              Round(100 *
              (PMPRBUSEDDLDTCH + PMPRBUSEDDLBCCH + PMPRBUSEDDLPCCH +PMPRBUSEDDLSRBFIRSTTRANS * (1 + PMPRBUSEDDLRETRANS / PMPRBUSEDDLFIRSTTRANS))
                                        /PMPRBAVAILDL,
                                         4) AS PRB_OCCU
                                         FROM DS_COUNTER_GROUP_ERIC_CG_L_1 T
                                         WHERE START_TIME >= V_DATE
                                           AND START_TIME < V_DATE + 1
                                              )
                                GROUP BY START_TIME,
                                         GROUP_ID)
                    --
                      SELECT V_DATE AS START_TIME,
                             GROUP_ID,
                             MAX(BUSY_TIME_MORNING) AS BUSY_TIME_MORNING,
                             MAX(PRB_OCCU_MORNING) AS PRB_OCCU_MORNING,
                             MAX(BUSY_TIME_EVENING) AS BUSY_TIME_EVENING,
                             MAX(PRB_OCCU_EVENING) AS PRB_OCCU_EVENING,
                             (CASE
                               WHEN MAX(NVL(PRB_OCCU_MORNING, 0)) >= MAX(NVL(PRB_OCCU_EVENING, 0)) THEN
                                MAX(BUSY_TIME_MORNING)
                               ELSE
                                MAX(BUSY_TIME_EVENING)
                             END) AS BUSY_TIME_DAY,
                             MAX(CASE
                                   WHEN NVL(PRB_OCCU_MORNING, 0) >= NVL(PRB_OCCU_EVENING, 0) THEN
                                    PRB_OCCU_MORNING
                                   ELSE
                                    PRB_OCCU_EVENING
                                 END) AS PRB_OCCU_DAY
                        FROM (SELECT GROUP_ID,
                                     FIRST_VALUE(START_TIME) OVER(PARTITION BY GROUP_ID, TRUNC(START_TIME, 'DD') ORDER BY PRB_OCCU DESC NULLS LAST) AS BUSY_TIME_MORNING,
                                     FIRST_VALUE(PRB_OCCU) OVER(PARTITION BY GROUP_ID, TRUNC(START_TIME, 'DD') ORDER BY PRB_OCCU DESC NULLS LAST) AS PRB_OCCU_MORNING,
                                     NULL AS BUSY_TIME_EVENING,
                                     NULL AS PRB_OCCU_EVENING
                                FROM V
                               WHERE START_TIME >= V_DATE
                                 AND START_TIME <= V_DATE + 11 / 24
                              UNION ALL
                              SELECT GROUP_ID,
                                     NULL,
                                     NULL,
                                     FIRST_VALUE(START_TIME) OVER(PARTITION BY GROUP_ID, TRUNC(START_TIME, 'DD') ORDER BY PRB_OCCU DESC NULLS LAST) AS BUSY_TIME_EVENING,
                                     FIRST_VALUE(PRB_OCCU) OVER(PARTITION BY GROUP_ID, TRUNC(START_TIME, 'DD') ORDER BY PRB_OCCU DESC NULLS LAST) AS PRB_OCCU_EVENING
                                FROM V
                               WHERE START_TIME >= V_DATE + 12 / 24
                                 AND START_TIME < V_DATE + 1)
                       GROUP BY GROUP_ID)
             ) S
      ON (D.START_TIME = S.START_TIME AND D.GROUP_ID = S.GROUP_ID AND D.START_TIME = V_DATE)
      WHEN MATCHED THEN
        UPDATE
           SET D.BUSY_TIME_MORNING5 = S.BUSY_TIME_MORNING,
               D.BUSY_TIME_EVENING5 = S.BUSY_TIME_EVENING,
               D.BUSY_TIME_DAY5     = S.BUSY_TIME_DAY,
               D.PRB_OCCU_MORNING5  = S.PRB_OCCU_MORNING,
               D.PRB_OCCU_EVENING5  = S.PRB_OCCU_EVENING,
               D.PRB_OCCU_DAY5      = S.PRB_OCCU_DAY;


相关10046trace文件如附件


收藏
分享
5条回答
默认
最新
文成
上传附件:noaplte2_ora_78389.trc
暂无图片 评论
暂无图片 有用 0
章芋文

请提供下这个trace文件

/u01/app/oracle/diag/rdbms/noaplte/noaplte2/incident/incdir_123552/noaplte2_ora_78389_i123552.trc
暂无图片 评论
暂无图片 有用 0
文成
暂无图片 评论
暂无图片 有用 0
章芋文

像是这个bug,Bug 18685209 - ORA-600 [kkogbro: no kkoaptyp] in FIRST_ROWS(k) mode with FULL OUTER JOIN (Doc ID 18685209.8)

ORA-600 errors can occur during optimization of queries having a full
outer join involving a table with no rows in first_rows(k) mode.
Rediscovery Notes
 If you get an ORA-600[kkogbro: no kkoaptyp] error during optimization of a
 full outer join in first_rows(k) mode, and one of the tables involved has no
 rows, you are probably hitting this bug  
Workaround
 Set "_optimizer_native_full_outer_join" = off

全外连接时,有个表没有数据会触发这个bug。

尝试会话级设置参数,运行SQL看是否仍然报600错误

alter session set "_optimizer_native_full_outer_join" = off;
暂无图片 评论
暂无图片 有用 0
文成
问题已关闭
暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
附件列表
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏