oracle 动态声明变量_oracle动态sql以及绑定变量

实现动态SQL有两种方式:DBMS_SQL和本地动态SQL(EXECUTE IMMEIDATE) 。

oracle从8代开始就提供了新的执行动态sql的功能:execute immeidate v_sql using *** into ***;

本地动态SQL

EXECUTE IMMEDIATE ‘语句’

[INTO {变量1, 变量2, … 变量N | 记录体}]

[USING [IN | OUT | IN OUT] 绑定变量1, … 绑定变量N]

[{RETURNING | RETURN} INTO 输出1 [, …, 输出N]…];

注意本地动态SQL仅支持弱类型REF CURSOR,即对于REF CURSOR,不支持BULK COLLECT.

动态SQL的使用:1、执行dml语句,在pl/sql中不能直接执行dml语句;2、执行的语句是在程序执行前不可估计的,就比如在运行时该sql才会被按照不同的条件进行拼接等。

该方法引用动态SQL的最大缺憾就是返回的结果集最多只能有一行,即使是ref cursor也只能包含一行的结果集。但是可以使用临时表的方法,把结果集存储起来,动态SQL执行完毕后再取数据就可以了。也就是说,这个动态SQL可以是一个块,里面的语句可以足够复杂,只要写作者认为自己有能力调试。

说到调试,也是动态SQL的一个很大的缺憾吧,在pl/sql中,一个varchar2的长度超过一定的大小后就自动转化为 long value,无法打印,无法查看,至少对于目前的我的能力,还没有找到方法,即使使用substr的方法来分解串再打印的方法都会失败。

绑定变量:动态SQL的形成一般使用的拼串和榜定变量两种方法,而普遍认为绑定变量有利于提高效率,其效率甚至与拼串的方式不可同日而语,这是可以理解的,绑定变量的使用,可以在多次执行sql时只使用一次语句分析、优化,而拼接则被认为是每次执行的sql都是不同的,每次执行都需要重新分析、优化,这往往是sql执行中最费时的操作。

动态sql高深莫测,如同指针一样,但为什么要使用那么晦涩的语法呢,除非不得已。

本文转自

http://hi.baidu.com/programcg/blog/item/7def5f02c3bcd20a4bfb515c.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值