zoukankan      html  css  js  c++  java
  • Oracle--SQL程序优化案例一

    下面是存储过程的一部分程序:  

    PROCEDURE SAP_MAN_ROUTING_SO (CITEM_ID    VARCHAR2,
                                     CSITE_ID    VARCHAR2,
                                     CTYPE       VARCHAR2)
       IS
          V_ROUTING   VARCHAR2 (40);
            BEGIN                                 
          IF (CITEM_ID NOT LIKE '%C%')
          THEN
             SELECT NVL (TRIM (RR.ROUTING_ID), '')
               INTO V_ROUTING
               FROM (SELECT MAPL.PLNNR || '_' || MAPL.WERKS ROUTING_ID
                       FROM SAP_MAPL_QMCUSTOMER MAPL
                      WHERE     MAPL.MATNR = CITEM_ID
                            AND MAPL.WERKS = CSITE_ID
                            AND EXISTS
                                   (SELECT NULL
                                      FROM SAP_MAPL_QMCUSTOMER
                                     WHERE     SAP_MAPL_QMCUSTOMER.MATNR =
                                                  CITEM_ID
                                           AND SAP_MAPL_QMCUSTOMER.WERKS =
                                                  CSITE_ID)) RR;
          ELSIF (CITEM_ID LIKE '%C%')
          THEN
             SELECT NVL (TRIM (RR.ROUTING_ID), '')
               INTO V_ROUTING
               FROM (SELECT MAX (MAPL.PLNNR) ROUTING_ID
                       FROM SAP_MAPL_QMCUSTOMER MAPL
                      WHERE MAPL.MATNR = CITEM_ID AND MAPL.WERKS = CSITE_ID) RR;
          END IF;
     从代码上来看,改程序似乎没有什么缺陷,执行也相当顺畅,但有一天突然一直报

    ORA-01403: 未找到任何数据ORA-06512: 在 "STG.SAP_SO_BOM_PROC", line 428
    ORA-06512: 在 "STG.SAP_SO_BOM_PROC", line 1097

    通过分析发现缺少对结果集行数做一个判断,如果返回的是0行数据,那就是没有值,没有值就会报错,

    所以以下是对该程序进行判断:

      PROCEDURE SAP_MAN_ROUTING_SO (CITEM_ID    VARCHAR2,
                                     CSITE_ID    VARCHAR2,
                                     CTYPE       VARCHAR2)
       IS
          V_ROUTING   VARCHAR2 (40);
          qty         number;
         BEGIN
           select count(*) into qty          
               FROM (SELECT MAPL.PLNNR || '_' || MAPL.WERKS ROUTING_ID
                       FROM SAP_MAPL_QMCUSTOMER MAPL
                      WHERE     MAPL.MATNR = CITEM_ID
                            AND MAPL.WERKS = CSITE_ID
                            AND EXISTS
                                   (SELECT NULL
                                      FROM SAP_MAPL_QMCUSTOMER
                                     WHERE     SAP_MAPL_QMCUSTOMER.MATNR =
                                                  CITEM_ID
                                           AND SAP_MAPL_QMCUSTOMER.WERKS =
                                                  CSITE_ID)) RR;
          IF qty>0  then                                       
          IF (CITEM_ID NOT LIKE '%C%')
          THEN
             SELECT NVL (TRIM (RR.ROUTING_ID), '')
               INTO V_ROUTING
               FROM (SELECT MAPL.PLNNR || '_' || MAPL.WERKS ROUTING_ID
                       FROM SAP_MAPL_QMCUSTOMER MAPL
                      WHERE     MAPL.MATNR = CITEM_ID
                            AND MAPL.WERKS = CSITE_ID
                            AND EXISTS
                                   (SELECT NULL
                                      FROM SAP_MAPL_QMCUSTOMER
                                     WHERE     SAP_MAPL_QMCUSTOMER.MATNR =
                                                  CITEM_ID
                                           AND SAP_MAPL_QMCUSTOMER.WERKS =
                                                  CSITE_ID)) RR;
          ELSIF (CITEM_ID LIKE '%C%')
          THEN
             SELECT NVL (TRIM (RR.ROUTING_ID), '')
               INTO V_ROUTING
               FROM (SELECT MAX (MAPL.PLNNR) ROUTING_ID
                       FROM SAP_MAPL_QMCUSTOMER MAPL
                      WHERE MAPL.MATNR = CITEM_ID AND MAPL.WERKS = CSITE_ID) RR;
          END IF;
          ELSE
            --程序漏洞,没有考虑返回值为0行的结果,现加判断参数qty作为返回行数的总数,大于1将执行原先的程序,否则直接赋空值 add by zhangguipeng20170216
            V_ROUTING:='';
            END IF;

  • 相关阅读:
    bootstrap-图片样式记录
    关于json数据中的多反斜杆转译--StringEscapeUtils.unescapeJava(踩过的坑)
    Nginx与tomcat组合的简单使用
    多进程之间的互斥信号量的实现(Linux和windows跨平台)
    跨平台(win和unix)的线程封装类
    linux 静态库、共享库
    WinMain与wWinMain,win32的字符集问题
    linux下添加动态链接库路径、动态库加载等方法
    win系统动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)
    dll程序开发总结
  • 原文地址:https://www.cnblogs.com/guipeng/p/6404218.html
Copyright © 2011-2022 走看看