PLSQL最佳实践

存在性检查

提防 DDL 提交事务

减少对 sysdate 的调用

把静态表达式迁出循环和 SQL 语句

与NULL值进行比较或逻辑运算的时候千万不要使用“=”,“”操作符,要用IS NULL操作符

(NULL值并不等于其它的所有值,甚至不等于另外的一个NULL值,程序代码应该显式的处理NULL值)

避免在声明部分指定默认值,特别这些值是函数调用返回的值

清理PLSQL块中的数据

最好不要在包说明中定义变量,每个对包有执行权限的人都可以看到甚至修改

在复杂的IF ELSIF ELSE 语句中,可以建议使用case语句来替代(不要忘记else语句),增强可读性。

PL/SQL的异常处理机制

image

避免在异常部分中嵌入应用程序逻辑

避免通过错误编码引用异常,若Oracle没给该异常命名,自己给它命一个

前:

image

后:

image

PL/SQL查询

把查询的值写入记录中,即使用%rowtype

只有当需要检索多行数据时,才使用游标for循环

PL/SQL修改

要始终显式列出INSERT语句中所使用的数据库表的列

SQL%属性总是会话中最近执行的隐式游标

动态SQL

把动态SQL字符串赋给一个变量,需要时尽可能用占位符,即绑定变量

避免SQL串联,防止SQL注入

对于存在动态SQL语句的程序(模式级别或者包内过程)来说,最好使用AUTHID CURRENT_USER定义为调用者模式,可最大程度降低风险

函数的要点就是能够返回一个值(标量、集合、记录),如果通过使用OUT、IN OUT参数列表返回值的话,则函数的功能用途显得不明显了,此时可以考虑使用过程。

对于子程序而言,参数列表应该明确地描述程序实现其功能时需要的参数,以及有可能返回的值。

如果需要往已有的程序增加参数时,要考虑原有调用程序能够不受影响,可使用以下方式:

当一个过程实现逻辑比较复杂时,最好对其进行功能拆分(逐步求精法、自顶向下设计法),使用本地子程序,使主程序执行部分可进行调用,使得逻辑更清晰,把实现细节进行封装。

尽可能把更多的业务规则封装、隐藏在函数中,供其它过程调用。

不要在函数中出现多个出口,遵循“一个入口只能有一个出口”,另外,在异常处理部分也要保留RETURN语句。

返回布尔值的函数绝对不能返回NULL(确保返回TRUE或者FALSE),这点在进行条件判断的时候尤其要注意。

包的最佳实践:

让程序包的关注面范围小而窄

使用程序包组合功能相关的程序,避免编写模式别的过程或函数

尽可能使用bull colect和forall进行批量提取数据,减少上下文切换

异常,考虑添加save exception

每个forall语句中,只可以执行一条DML语句

更多内存,空间换时间

LIMIT子句

没有游标属性

非字符串索引的集合,集合索引值始终从1开始

关于bull colect的建议

关于forall的建议

缓存实践(尽可能在最快的内存位置,缓存静态数据)

结果缓存,保存在SGA,消耗内存小

包缓存,保存在PGA,消耗内存大

管道函数

当集合和记录是OUT或IN OUT参数时,可以考虑使用NOCOPY降低负载

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180917G01N9H00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券