存在性检查
提防 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降低负载
领取专属 10元无门槛券
私享最新 技术干货