【博客文章背景】博客开通已经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大字段的数据库存储过程处理,没少从博客园的技术贴偷东西(得意地笑!!!),蹒跚走来总结了这几条虽不算高深却可以少挨骂的经验教训,希望新来的(刚接触存储过程的)、常住的(论坛长时间潜水的--比如我)积极扔砖!

算了,不说了,最近上海持续高温,说多了都是汗,还是虚汗!!!

  【言归正传】总结如下:

  1. 常见的数据处理如截取、替换、包含等,先上网再实现,即“拿来主义”
  2. 变量命名要易于理解,即“望文生义”
  3. 变量命名要避开列名,即“大路朝天各走一边”
  4. 游标中的sql要尽量简单,即“简简单单我的心”
  5. 涉及到insert、update等根据约束要添加异常处理,即“防患未然”
  6. trigger中有事务机制,不能在调用的存储过程中使用commit,即“不要越俎代庖”
  7. 清空表中数据时要用“EXECUTE IMMEDIATE ‘truncate table tablename’”,即“特事特办”
  8. null与’’、’’与’’不相等,即”翻脸不认人”
  9. sql优化尽量一次完成,即"没有更好,只有够好"

  【内容解释】具体解释及(或)代码如下:

  1. “拿来主义”:亲,时刻牢记,google、度娘不能只用来八卦、娱乐,在没有费别人的脑子之前,不要尝试自己搞个算法
  2. “望文生义”:这就不用解释了
  3. “大路朝天各走一边”:1、避免自己在变量的处理中搞晕自己,特别是变量放在select结果中处理 2、可读性高(结合"望文生义")
  4. “简简单单我的心”:易于业务逻辑的确认和维护(开发人员定规则的情况及后续业务变更
  5. “防患未然”:不解释,除非你想让存储过程抛错给你的程序捕获详细信息
  6. “不要越俎代庖”:这个是基本常识,小心找死
  7. “特事特办”:不仅仅体现在对清表的操作,我们需要根据实际业务需要在存储过程中使用一些提升效率的方法
  8. ”翻脸不认人”:数据库中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;

  9. "没有更好,只有够好":这句话不是说大家不要追求最好,而是要尽你当下的可能把代码优化好,一旦你的代码提交并发布到实际运行环境中,除非项目负责人要求你优化再优化(都这种地步,就真得优化了),否则你可以嫌它丑但尽量不要动--不错,勿动!(我们测试一轮近1周,测试至少要3轮,如果改了核心的东西,就得相关程序全盘再测,知道为什么了吧?不说了都是泪!)

附送大家使用ROWNUM,要注意几点事项:

    1、>=不考虑 ----例子:where ROWNUM >2或 ROWNUM = 2或 ROWNUM >=2的记录
2、=常伴<或1 ----例子:where ROWNUM < 3等价于 ROWNUM <= 2 或 ROWNUM=1
3、ROWNUM变为结果集
想怎么使用都随意----例子:分页查询最后一个rn
  1. 举例如下:
    select * from
    (select rownum rn ,t.* from
    test t where rownum < 4 -- 等价于rownum<=3 rownum >=4一定为空
    )temp where temp.rn > 1;--ROWNUM 变为结果集(缓存参数集)

Oracle存储过程的一点使用总结的更多相关文章

  1. oracle 存储过程(分析理解)

    我的理解 比较简单(仅供参考)   存储过程就相当于java里面的方法 简单讲就是一串代码能够实现某个特定的功能,想要使用这个方法直接调用方法名就能够使用他的功能,这就是方法 oracle 存储过程也 ...

  2. Oracle 存储过程_(收集)

    oracle 存储过程的基本语法 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字(    参数1 IN NUMBER,    参数2 IN NUMBER) IS变量 ...

  3. oracle 存储过程

    来自:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 I ...

  4. Oracle存储过程语法

    原文链接:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程  1 CREATE OR REPLACE PROCEDURE 存储过程名  ...

  5. ORACLE存储过程调用Web Service

    1. 概述 最近在ESB项目中,客户在各个系统之间的服务调用大多都是在oracle存储过程中进行的,本文就oracle存储过程调用web service来进行说明.其他主流数据库,比如mysql和sq ...

  6. Oracle存储过程基本语法介绍

    Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...

  7. MyBatis调用Oracle存储过程

    MyBatis调用Oracle存储过程 1.无输入和输出参数的存储过程 2.带有输入和输出参数的存储过程 3.返回游标的存储过程 mybatis中的配置文件代码 <resultMap type= ...

  8. Oracle存储过程(转)

    Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...

  9. Oracle存储过程中异常Exception的捕捉和处理

    Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...

随机推荐

  1. 解决 Visual Studio 2012 有时不能调试的问题

    有时候发现 Visual Studio 2012 不能调试,有时候又能调试.感觉很烦,今天找到了一个解决办法,我也不知道为什么这样能解决. 问题: 解决:1. 找到 Properties ,双击 2. ...

  2. javascript XMLHttpRequest对象全面剖析

    转载:http://www.jb51.net/article/23175.htm 一. 引言 异步JavaScript与XML(AJAX)是一个专用术语,用于实现在客户端脚本与服务器之间的数据交互过程 ...

  3. (原)前端知识杂烩(css系列)

    更新于 20160217 1. css hack .pad{ padding:17px 0 0 17px; /* 普通写法 */ *padding:17px 0 0 17px; /* *为IE7 *+ ...

  4. phantomjs API

    phantomjs使用说明         phantomjs实现了一个无界面的webkit浏览器.虽然没有界面,但dom渲染.js运行.网络访问.canvas/svg绘制等功能都很完备,在页面抓取. ...

  5. JS中表格的全选和删除要注意的问题

    在项目开发中,由于刚刚开始做项目,我对js还不是很精通,所以在用js对表格的全选和删除中遇到了不少问题,后来通过查找资料解决了,之后总结了一下关于js表格的全选和删除出现的一些问题,希望能帮助到大家. ...

  6. S​Q​L​ ​S​e​r​v​e​r​中​​的​P​W​D​E​N​C​R​Y​P​T​与​P​W​D​C​O​M​P​A​R​E​函​数

    前幾天有個客戶的網站出問題(不是我們開發的),請我們幫他看,主要的問題是他們的網站會員在進行查詢密碼時,會員收到信的時候在密碼的欄位竟然會出現 System.Binary[] 字樣.而我進去資料庫中查 ...

  7. python-整理-面向对象

    python的类和perl的类有相似之处,类的方法的第一个参数是表示类的对象自己,相当于c#的this python中定义类 class person: ''示例类,人'' count=0; def ...

  8. PHP header() http各种状态码大全查询

    PHP header()the function declaration: void header ( string string [, bool replace [, int http_respon ...

  9. php 日期 - 获取当月最后一天

    /** * 日期-获取当月最后一天 * @return int */ public function get_lastday() { if($this->month==2) { $lastday ...

  10. gnome-ssh-askpass:No such file or directory && unable to read askpass response

    1.使用git的时候,gnome-ssh-askpass出现“error: cannot run /usr/libexec/openssh/gnome-ssh-askpass: No such fil ...