[转]ORACLE 绑定变量用法总结

转:http://blog.csdn.net/wanghai__/article/details/4778343

在oracle 中,对于一个提交的sql语句,存在两种可选的解析过程, 一种叫做硬解析,一种叫做软解析.

一个硬解析需要经解析,制定执行路径,优化访问计划等许多的步骤.硬解释不仅仅耗费大量的cpu,更重要的是会占据重要的们闩(latch)资源,严重的影响系统的规模的扩大(即限制了系统的并发行),而且引起的问题不能通过增加内存条和cpu的数量来解决。之所以这样是因为门闩是为了顺序访问以及修改一些内存区域而设置的,这些内存区域是不能被同时修改。当一个sql语句提交后,oracle会首先检查一下共享缓冲池(shared pool)里有没有与之完全相同的语句,如果有的话只须执行软分析即可,否则就得进行硬分析。

而唯一使得oracle 能够重复利用执行计划的方法就是采用绑定变量。绑定变量的实质就是用于替代sql语句中的常量的替代变量。绑定变量能够使得每次提交的sql语句都完全一样。

 

 

1.

 

sqlplus中如何使用绑定变量,可以通过variable来定义 从上面试验发现绑定变量i的使用使查询id=1和id=2的sqlselect *from tt where id=:i得以重复 使用,从而避免了hard parse,这里的PARSE_CALLS=2包括了一次soft parse

 

 

2.

前两天看到有人在pub上问sqlplus中通过define和variable定义的变量的区别。其实define定义的我
理解不是变量而是字符常量,通过define定义之后,在通过&或者&&引用的时候不需要输入了,仅此而已。
oracle在执行的时候自动用值进行了替换;而variable定义的是绑定变量,上面已经提到。

 

 

3.

oracle在解析sql时会把plsql中定义的变量转为为绑定变量 另外从hard parse的数据量上其实也可以大致猜测oracle会把plsql中定义的变量转换为绑定变量处理

这里发现hard parse只增加了2,如果没有使用绑定变量的话,相信hard parse会更多

 

 

4.

过程中的参数会自动转化为绑定变量

另外也可以直观的观察:

在sqlplus里执行过程不能观察出来 下面在plsql developer执行一次过程之后再来看执行的情况

很显然oracle在执行过程时把参数转化为绑定变量了,其实从plsql developer中执行过程时的语法就能
看出来: 在输入参数列表框上面的执行语法就是这样的。

 

 

5.

在动态sql中使用绑定变量,动态sql中使用绑定变量非常明显也容易理解,下面给出2个简单的例子

 

=============================下面加上一些其他变量的使用方法=========================

 

eg001(&替换变量)

 

 

eg002(&&替换变量)

 

eg003

DEFINE[variable[=value]] UNDEFINE清除定义的变量

eg004 ACCEPT variable[datatype[NUMBER|CHAR|DATE]][FORMAT format][PROMPT text][HIDE]/*variable:指定接收值的变量。该名称的变量不存在,那么SQL重建该变量;datatype:变量数据类型,默认为CHAR*/

 

 

posted @ 2016-04-29 10:02  pompeii  阅读(456)  评论(0编辑  收藏  举报