本人有1点疑问想请教大家:
1.对于那些频繁执行的语句,使用绑定变量会提高效率,但如果使用绑定变量是不是就一定要用动态SQL(execute immediate)语句来实现,如果必须要用execute immediate语句来实现的话,使用execute immediate语句效率高吗?????
如果不用动态SQL(execute immediate),我想用绑定变量应该如果改,以下是我的语句:但是报错
提示:ora-00933,SQL命令未正常结束;
delete from emp_award   where code = :1   and bmonth=:2  using v_code,v_month;

解决方案 »

  1.   

    针对动态SQL,oracle有自己的包DBMS_SQL。
    不过:1.对于那些频繁执行的语句,使用绑定变量会提高效率
    能解释一下吗?
      

  2.   

    delete from emp_award   where code = :1   and bmonth=:2 ;
    这种pl/sql已经是绑定变量了!sql := 'delete from emp_award   where code = :1   and bmonth=:2';
    execute immediate sql using v1, v2;这样也是绑定变量
      

  3.   

    在语法分析期间,SQL语句从用户进程传送到Oracle,SQL语句经语法分析后,SQL语句本身与分析的信息都被装入到共享SQL区。在该阶段中,可以解决许多类型的错误。语法分析分别执行下列操作:
    l        翻译SQL语句,验证它是合法的语句,即书写正确
    l        实现数据字典的查找,以验证是否符合表和列的定义
    l        在所要求的对象上获取语法分析锁,使得在语句的语法分析过程中不改变这些对象的定义
    l        验证为存取所涉及的模式对象所需的权限是否满足
    l        决定此语句最佳的执行计划
    l        将它装入共享SQL区
    l        对分布的语句来说,把语句的全部或部分路由到包含所涉及数据的远程节点
          以上任何一步出现错误,都将导致语句报错,中止执行。      只有在共享池中不存在等价SQL语句的情况下,才对SQL语句作语法分析。在这种情况下,数据库内核重新为该语句分配新的共享SQL区,并对语句进行语法分析。进行语法分析需要耗费较多的资源,所以要尽量避免进行语法分析,这是优化的技巧之一。      语法分析阶段包含了不管此语句将执行多少次,而只需分析一次的处理要求。Oracle只对每个SQL语句翻译一次,在以后再次执行该语句时,只要该语句还在共享SQL区中,就可以避免对该语句重新进行语法分析,也就是此时可以直接使用其对应的执行计划对数据进行存取。这主要是通过绑定变量(bind variable)实现的,也就是我们常说的共享SQL