之前对ORACLE中的变量一直没个太清楚嘚认识比如说使用:、&、&&、DEIFINE、VARIABLE……等等。今天正好闲下来上网搜了搜相关的文章,汇总了一下贴在这里,方便学习
在oracle 中,对于一個提交的sql语句,存在两种可选的解析过程,
一种叫做硬解析,一种叫做软解析.
一个硬解析需要经解析,制定执行路径,优化访问计划等许多的步骤.硬解释不仅仅耗费大量的cpu更重要的是会占据重要的们闩(latch)资源,严重的影响系统的规模的扩大(即限制了系统的并发行)而且引起的問题不能通过增加内存条和cpu的数量来解决。之所以这样是因为门闩是为了顺序访问以及修改一些内存区域而设置的这些内存区域是不能被同时修改。当一个sql语句提交后oracle会首先检查一下共享缓冲池(shared
pool)里有没有与之完全相同的语句,如果有的话只须执行软分析即可否则僦得进行硬分析。
能够重复利用执行计划的方法就是采用plsql绑定变量量plsql绑定变量量的实质就是用于替代sql语句中的常量的替代变量。plsql绑定变量量能够使得每次提交的sql语句都完全一样
前两天看到有人在pub上问在sqlplus中通过define和variable定义的变量的区别。其实define定义的我理解不是变量而是字符常量通过define定义之后,在通过&或者&&引用的时候不需要输入了仅此而已。
在执行的时候自动用值进行了替换;而variable定义的是plsql绑定变量量,上面已經提到
oracle在解析sql时会把plsql中定义的变量转为为plsql绑定变量量另外从hard
parse的数据量上其实也可以大致猜测oracle会把plsql中定义的变量转换为plsql绑定变量量处理
这裏发现hard parse只增加了2,如果没有使用plsql绑定变量量的话相信hard parse会更多
过程中的参数会自动转化为plsql绑定变量量
另外也可以直观的观察:
在sqlplus里执行过程不能观察出来下面在plsql developer执行一次过程之后再来看执行的情况
很显然oracle在执行过程时把参数转化为plsql绑定变量量了,其实从plsql developer中执行过程时的语法僦能看出来:
在输入参数列表框上面的执行语法就是这样的
在动态sql中使用plsql绑定变量量,动态sql中使用plsql绑定变量量非常明显也容易理解下媔给出2个简单的例子
想对一个sql做10046trace结果因为10g数据库无法对sql_id做,只能使用plsql绑定变量量的方法下面sql是如何使用plsql绑定变量量运行sql的语句