Oracle存储过程的一点使用总结
【博客文章背景】博客开通已经1、2年了,一直碍于技术能力,不敢献丑。想起1年前在一个数据处理相关项目结束后,代金排主管让我做一个数据库开发总结文档和一个Toad、PL/SQL Developer工具的存储过程测试方法总结文档,并安排讲解给其他同事们(高级主管、主管、几年工作经验的开发同事、一块进公司的毕业生)并得好评之后(更多是鼓励吧!),代说文档是丑了点,但你讲的东西让我们这些只是简单使用sql语句的人,也是大开眼界。你不是注册了博客园?你可以把它们整理一下发到上面,对自己而言是个好事情,对别人而已也是个好事情!今天手中的项目告一段落,看着自己的博客一直空着,又想着代金排主管当时的话,还有自己觉得自己只有这点能力,整理了几句话送给各位。同时借这篇文章对帮助我、鼓励我的金排主管说句:谢谢你!
【数据库学习经历】从大二开始接触并学习数据库MS Server2005 、Oracle 10g(感谢学校开了这两门课,很多同事也吃惊我们专门开了这两门课而且每课都是一学期、必修、3个学分),虽然当时云里雾里,但是肯定把51、智联等招聘网站上查看我的求职简历的负责招聘的HR或技术主管的小朋友们吓呆了。
【oracle使用经历】虽然学了oracle,不过从大一下学期就直使用的mysql(实在没有用到oracle的地方),不过因为从实习到现在一直接触的都是oracle ,所以MS的相关东东只能扔给老师了(惭愧惭愧)...实习时从plsql中的建表、用户、授权、增删改查到简单的java webservice对oracle的增删改查,一点点的到现在写存储过程、写job、改写优化公司老人的package、数据初始化脚本...
【存储过程使用经历】正式入职后接触的第一个项目就是数据库Clob大字段的数据库存储过程处理,没少从博客园的技术贴偷东西(得意地笑!!!),蹒跚走来总结了这几条虽不算高深却可以少挨骂的经验教训,希望新来的(刚接触存储过程的)、常住的(论坛长时间潜水的--比如我)积极扔砖!
算了,不说了,最近上海持续高温,说多了都是汗,还是虚汗!!!
【言归正传】总结如下:
- 常见的数据处理如截取、替换、包含等,先上网再实现,即“拿来主义”
- 变量命名要易于理解,即“望文生义”
- 变量命名要避开列名,即“大路朝天各走一边”
- 游标中的sql要尽量简单,即“简简单单我的心”
- 涉及到insert、update等根据约束要添加异常处理,即“防患未然”
- trigger中有事务机制,不能在调用的存储过程中使用commit,即“不要越俎代庖”
- 清空表中数据时要用“EXECUTE IMMEDIATE ‘truncate table tablename’”,即“特事特办”
- null与’’、’’与’’不相等,即”翻脸不认人”
- sql优化尽量一次完成,即"没有更好,只有够好"
【内容解释】具体解释及(或)代码如下:
- “拿来主义”:亲,时刻牢记,google、度娘不能只用来八卦、娱乐,在没有费别人的脑子之前,不要尝试自己搞个算法
- “望文生义”:这就不用解释了
- “大路朝天各走一边”:1、避免自己在变量的处理中搞晕自己,特别是变量放在select结果中处理 2、可读性高(结合"望文生义")
- “简简单单我的心”:易于业务逻辑的确认和维护(开发人员定规则的情况及后续业务变更
- “防患未然”:不解释,除非你想让存储过程抛错给你的程序捕获详细信息
- “不要越俎代庖”:这个是基本常识,小心找死
- “特事特办”:不仅仅体现在对清表的操作,我们需要根据实际业务需要在存储过程中使用一些提升效率的方法
- ”翻脸不认人”:数据库中null、''是特殊的存在,特别是你自己定义变量然后使用的时候,要小心,有兴趣的测测代码(oracle不会错,只是我们的理解错了,你懂了吗?)
SELECT CASE WHEN '' IS NULL
THEN '1' ELSE '2' END testtest FROM DUAL;
SELECT CASE WHEN '' = ''
THEN '1' ELSE '2' END testtest FROM DUAL;
SELECT CASE WHEN '' = NULL
THEN '1' ELSE '2' END testtest FROM DUAL;
SELECT CASE WHEN NULL = NULL
THEN '1' ELSE '2' END testtest FROM DUAL;
SELECT CASE WHEN NULL IS NULL
THEN '1' ELSE '2' END testtest FROM DUAL;
SELECT CASE WHEN LENGTH (NULL) <> 0
THEN '1' ELSE '2' END testtest FROM DUAL;
SELECT CASE WHEN LENGTH (NULL) IS NULL
THEN '1' ELSE '2' END ttest FROM DUAL;
SELECT CASE WHEN LENGTH ('') IS NULL
THEN '1' ELSE '2' END ttest FROM DUAL;
SELECT CASE WHEN LENGTH ('') = 0
THEN '1' ELSE '2' END ttest FROM DUAL; - "没有更好,只有够好":这句话不是说大家不要追求最好,而是要尽你当下的可能把代码优化好,一旦你的代码提交并发布到实际运行环境中,除非项目负责人要求你优化再优化(都这种地步,就真得优化了),否则你可以嫌它丑但尽量不要动--不错,勿动!(我们测试一轮近1周,测试至少要3轮,如果改了核心的东西,就得相关程序全盘再测,知道为什么了吧?不说了都是泪!)
附送大家使用ROWNUM,要注意几点事项:
1、>=不考虑 ----例子:where ROWNUM >2或 ROWNUM = 2或 ROWNUM >=2的记录
2、=常伴<或1 ----例子:where ROWNUM < 3等价于 ROWNUM <= 2 或 ROWNUM=1
3、ROWNUM变为结果集
想怎么使用都随意----例子:分页查询最后一个rn
举例如下:
select * from
(select rownum rn ,t.* from
test t where rownum < 4 -- 等价于rownum<=3 rownum >=4一定为空
)temp where temp.rn > 1;--ROWNUM 变为结果集(缓存参数集)
Oracle存储过程的一点使用总结的更多相关文章
- oracle 存储过程(分析理解)
我的理解 比较简单(仅供参考) 存储过程就相当于java里面的方法 简单讲就是一串代码能够实现某个特定的功能,想要使用这个方法直接调用方法名就能够使用他的功能,这就是方法 oracle 存储过程也 ...
- Oracle 存储过程_(收集)
oracle 存储过程的基本语法 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字( 参数1 IN NUMBER, 参数2 IN NUMBER) IS变量 ...
- oracle 存储过程
来自:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 I ...
- Oracle存储过程语法
原文链接:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 ...
- ORACLE存储过程调用Web Service
1. 概述 最近在ESB项目中,客户在各个系统之间的服务调用大多都是在oracle存储过程中进行的,本文就oracle存储过程调用web service来进行说明.其他主流数据库,比如mysql和sq ...
- Oracle存储过程基本语法介绍
Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...
- MyBatis调用Oracle存储过程
MyBatis调用Oracle存储过程 1.无输入和输出参数的存储过程 2.带有输入和输出参数的存储过程 3.返回游标的存储过程 mybatis中的配置文件代码 <resultMap type= ...
- Oracle存储过程(转)
Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...
- Oracle存储过程中异常Exception的捕捉和处理
Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...
随机推荐
- webapi单元测试时出现的ConfigurationManager.ConnectionStrings为空错误
这个是读取配置文件没读到的问题,解决方法很简单,把webapi的配置文件复制到单元测试项目中,并把名字改为App.config即可. 同时 ,推荐使用Unit Test Genertor来做测试,这个 ...
- 图的深度优先遍历的实现 c/c++ DFS
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h&g ...
- c++ 资源索引
1.http://snippets.dzone.com/tag/c/ --数以千计的有用的C语言源代码片段 2.http://www.hotscripts.com/category/c-cpp/sc ...
- C++ 开源库
1.C++各大有名库的介绍——C++标准库 2.C++各大有名库的介绍——准标准库Boost 3.C++各大有名库的介绍——GUI 4.C++各大有名库的介绍——网络通信 5.C++各大有名库的介绍— ...
- 区段extent及数据块
一.区段是表空间中由某个段所使用的一块磁盘空间.他是一组连续的oracle数据块.引入extent的目的是为了减少磁盘空间分配的次数,如果是采用oracle数据块直接分配的话就增加了oracle磁盘空 ...
- php 代码重用
<?php /* 21.php * 代码重用 * include() required()载入文件 * include() 如果载入文件不存在,提示警告,还可以继续执行 * required() ...
- [转]在ITunes播放中前进、后退五秒的快捷键
在ITunes播放中前进.后退五秒的快捷键 如题,快捷键为Command+Alt+方向键.听Podcast一两句没听清楚的时候很有用. reference: http://mac.pcbeta.com ...
- Python之路第八天,进阶-设计模式
设计模式 单例模式 单例,顾名思义单个实例. 学习单例之前,首先来回顾下面向对象的内容: python的面向对象由两个非常重要的两个"东西"组成:类.实例 面向对象场景一: 如:创 ...
- Python之路第七天,基础(9)-面向对象(上)
面向对象的编程思想 回想 我们所学过的编程方法: 面向过程:根据业务逻辑从上到下写堆叠代码. 函数式编程:将重复的代码封装到函数中,只需要写一遍,之后仅调用函数即可. 面向过程编程最易被初学者接受,其 ...
- python核心编程-第五章-个人笔记
1.用del删除对对象的引用 >>> a = 123 >>> a 123 >>> del a >>> a Traceback ( ...