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;
Oracle--SQL程序优化案例一的更多相关文章
- Oracle SQL性能优化技巧大总结
http://wenku.baidu.com/link?url=liS0_3fAyX2uXF5MAEQxMOj3YIY4UCcQM4gPfPzHfFcHBXuJTE8rANrwu6GXwdzbmvdV ...
- Oracle SQL 性能优化技巧
Select语句完整的执行顺序: SQL Select语句完整的执行顺序: 1. from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子句将 ...
- 利用 Oracle EM 企业管理器 进行oracle SQL的优化(自动生成索引)
利用 Oracle EM 企业管理器 进行oracle SQL的优化(自动生成索引) ##应用情景 项目中有大量的SQL,尤其是涉及到统计报表时,表关联比较多,当初开发建表时也没搞好索引关联的,上线后 ...
- ORACLE SQL性能优化(全)
ORACLE SQL性能优化(全) http://wenku.baidu.com/view/b2aaba3887c24028915fc337.html
- SQL性能优化案例分析
这段时间做一个SQL性能优化的案例分析, 整理了一下过往的案例,发现一个比较有意思的,拿出来给大家分享. 这个项目是我在项目开展2期的时候才加入的, 之前一期是个金融内部信息门户, 里面有个功能是收集 ...
- Oracle SQL语句优化34条
非常好用的SQL语句优化34条 1)选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 dri ...
- Oracle SQL的优化
SQL的优化应该从5个方面进行调整:1.去掉不必要的大型表的全表扫描2.缓存小型表的全表扫描3.检验优化索引的使用4.检验优化的连接技术5.尽可能减少执行计划的Cost SQL语句:是对数据库(数据) ...
- Oracle SQL性能优化系列
1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化器,可以通过对init.o ...
- ORACLE SQL性能优化汇总
ORACLE SQL语句共享 Oracle SQL语句具备共享特性,为了不让ORACLE数据库重复解析相同的简单单表SQL语句,ORACLE在SGA系统共享区域内SBP共享池内存放的SQL语句将被所有 ...
- Oracle-SQL程序优化案例二
有时候写得不规范的SQL语句真的是占用很多时间 以下是我在工作中发现的规律,如果字段过多的使用函数,尽量不要将这些字段串联在一起做匹配或查询条件,比如红色注释部分,在执行红色部分的时候 这个SQL程序 ...
随机推荐
- SpringBoot、ActiveMQ整合阿里大鱼-----短信服务
3.短信微服务 3.1需求分析 构建一个通用的短信发送服务(独立于优乐选的单独工程),接收activeMQ的消息(MAP类型) 消息包括手机号(mobile).短信模板号(template_code ...
- [集合]Map
Map集合的功能概述 a:添加功能 * V put(K key,V value):添加元素.* 如果键是第一次存储,就直接存储元素,返回null * 如果键不是第一次存在,就用值把以前的值替换掉, ...
- laravel5.5结合bootstrap上传插件fileinput 上传图片
引入相关js <script src="{{ asset('bootstrap-fileinput/js/fileinput.js') }}"></script& ...
- 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)
洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...
- PHP 如何实现页面静态化
页面静态化分为两种 一种伪静态,即url重写,一种纯静态化. 一.静态化的优点: 1有利于搜索引擎收录网站页面的信息:搜索引擎更喜欢静态的,更变于抓取,搜索引擎SEO排名会更容易提高. 2静态网页化网 ...
- windows10操作系统上使用virtualenv虚拟环境
前提win10上已经安装了Python环境! virtualenv库的使用: 安装 如果win10上同时安装了Python2和python3的安装virtualenv时用; Python2:pip i ...
- Java关于继承中的内存分配
1.定义 super:当前对象的父类对象 this :当前对象,谁调用this所在的方法,this就是哪一个对象. 2.内存分析 另一个例子: public s ...
- jdk8中几个核心的函数式接口笔记
1. Function接口 /** * function 接口测试 * function 函数只能接受一个参数,要接受两个参数,得使用BiFunction接口 */ public class Func ...
- wpf textblock 长文本滚动
在textblock添加滚动条 <ScrollViewer VerticalScrollBarVisibility="Auto"> <TextBlock x:Na ...
- JavaEE高级-MyBatis学习笔记
一.MyBatis简介 - MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架. - MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. - My ...