【博客文章背景】博客开通已经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 变为结果集(缓存参数集)