动态sql与静态sql

本文介绍了Oracle数据库中动态SQL与静态SQL的区别,详细解释了动态SQL的应用场景及其带来的灵活性,并提供了提高动态SQL性能的三个实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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为一个大的对象类型。这样只是传递一个地址,而不是传递整个对象了。显然这样的处理也是提高了效率
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值