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程序 ...
随机推荐
- 刘铁猛-深入浅出WPF-系列资源汇总
首先奉上原作者刘铁猛博客地址:http://www.cnblogs.com/prism/ 作者讲的很不错,没有之一,另外作者出了一本书,希望大家支持. 送上全套高清晰视频教程(我注册了3个51cto的 ...
- 2019第二周总结.Java
本学期开始学习Java课程了,首先我先说说学习Java的感觉吧,它不像C语言程序设计,但是又有语言开发的共同点.学Java语言重点是面向对象的程序设计,更加的适应生活需要和计算机开发的需要. 总的来讲 ...
- 第九周总结&第七次实验报告
实验7 实验任务详情: 完成火车站售票程序的模拟. 要求: (1)总票数1000张: (2)10个窗口同时开始卖票: (3)卖票过程延时1秒钟: (4)不能出现一票多卖或卖出负数号票的情况. 实验过程 ...
- java主方法组成分析
public static void main(String args[]) public :是一种访问权限,主方法是一切的开始点,开始点一定是公共的 static :表示此方法可由类直接调用 voi ...
- 虚拟机上首次安装Ubuntu后 root密码设置
虚拟机下安装ubuntu后root密码设置 问题描述: 在虚拟机下安装了ubuntu中要输入用户名,一般情况下大家都会输入一个自己的网名或绰号之类的,密码也在这时设置过了. 但是当安装成功之后,使用命 ...
- pistat 查看进程状态
该pidstat命令用于监视当前正在由Linux内核管理的各个任务.对于使用选项-p选择的每个任务,或者如果使用了选项-p ALL,则它将写入Linux内核管理的 每个任务的标准输出活动.不选择任何任 ...
- Python 入门之 Python三大器 之 迭代器
Python 入门之 Python三大器 之 迭代器 1.迭代器 (1)可迭代对象: <1> 只要具有__ iter __()方法就是一个可迭代对象 (我们可以通过dir()方法去判断一个 ...
- link标签中的integrity和crossorigin字段
https://blog.csdn.net/SNP_fuyun/article/details/77113985?locationNum=10&fps=1
- 一分钟搭建 Web 版的 PHP 代码调试利器
一.背景 俗话说:"工欲善其事,必先利其器".作为一门程序员,我们在工作中,经常需要调试某一片段的代码,但是又不想打开繁重的 IDE (代码编辑器).使用在线工具调试代码有时有 ...
- C#设计模式:访问者模式(Vistor Pattern)
一,访问者模式是用来封装一些施加于某种数据结构之上的操作.它使得可以在不改变元素本身的前提下增加作用于这些元素的新操作,访问者模式的目的是把操作从数据结构中分离出来. 二,代码 using Syste ...