1、定义区别:
Oracle编译PL/SQL程序块分为两个种:其一为预编译(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型;另外一种是运行时编译(late binding),即SQL语句只有在运行阶段才能建立,例如当查询条件为用户输入时,那么Oracle的SQL引擎就无法在编译期对该程序语句进行确定,只能在用户输入一定的查询条件后提交给sql引擎处理。静态属前种,动态属后种
2、动态sql的作用
a、在pl/sql中使用除DML,DCL以外的其他DDL等
b、当DML操作对象或条件不确定时,也用动态sql
3、动态sql牺牲性能,换来灵活性。里边可以绑定变量 using 还有使用 returning into 来用输出参数列表;
4、动态sql开发技巧
技巧一:尽量使用类似的SQL语句,这样Oracle本身通过SGA中的共享池来直接对该SQL语句进行缓存,那么在下一次执行类似语句时就直接调用缓存中已解析过的语句,以此来提高执行效率。
技巧二:当涉及到集合单元的时候,尽量使用forall
技巧三:使用NOCOPY编译器来提高PL/SQL性能。缺省情况下,out类型和in out类型的参数是由值传递的方式进行的。但是对于大的对象类型或者集合类型的参数传递而言,其希望损耗将是很大的,为了减少损耗,可以采用引用传递的方式,即在进行参数声明的时候引用NOCOPY关键字来说明即可到达这样的效果。比如创建一个过程:
create or replace procedure test(p_object in nocopy square) ... end; |
其中square为一个大的对象类型。这样只是传递一个地址,而不是传递整个对象了。显然这样的处理也是提高了效率