CSDN博客

img firefoxboy

oracle动态sql以及绑定变量

发表于2008/10/2 17:01:00  874人阅读

        实现动态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 0

相关博文

我的热门文章

img
取 消
img