什么是bind variable(绑定变量)?

来源:互联网 发布:plc触摸屏编程软件 编辑:程序博客网 时间:2024/04/28 03:56

查询通常只是因为改变where子句中的内容而产生不同的结果。为了在这种情况下避免硬解析,需要使用绑定变量(bind variable)。它是用户放入查询中的占位符,它会告诉Oracle"我会随后为这个变量提供一个值,现在需要生成一个方案,但我实际执行语句的时候,我会为您提供应该使用的实际值"。
    select * from emp where ename='KING'; //不使用绑定变量
    select * from emp where ename=:bv     //使用绑定变量

一般在 procedure or function 中使用,可以优化共享池的使用。

在语法分析期间,SQL语句从用户进程传送到Oracle,SQL语句经语法分析后,SQL语句本身与分析的信息都被装入到共享SQL区。在该阶段中,可以解决许多类型的错误。

语法分析分别执行下列操作:
l        翻译SQL语句,验证它是合法的语句,即书写正确
l        实现数据字典的查找,以验证是否符合表和列的定义
l        在所要求的对象上获取语法分析锁,使得在语句的语法分析过程中不改变这些对象的定义
l        验证为存取所涉及的模式对象所需的权限是否满足
l        决定此语句最佳的执行计划
l        将它装入共享SQL区
l        对分布的语句来说,把语句的全部或部分路由到包含所涉及数据的远程节点
      以上任何一步出现错误,都将导致语句报错,中止执行。

      只有在共享池中不存在等价SQL语句的情况下,才对SQL语句作语法分析。在这种情况下,数据库内核重新为该语句分配新的共享SQL区,并对语句进行语法分析。进行语法分析需要耗费较多的资源,所以要尽量避免进行语法分析,这是优化的技巧之一。

      语法分析阶段包含了不管此语句将执行多少次,而只需分析一次的处理要求。Oracle只对每个SQL语句翻译一次,在以后再次执行该语句时,只要该语句还在共享SQL区中,就可以避免对该语句重新进行语法分析,也就是此时可以直接使用其对应的执行计划对数据进行存取。这主要是通过绑定变量(bind variable)实现的,也就是我们常说的共享SQL