一般的应用程序都很少有使用绑定变量的,在大型的生产系统中,这种做法尤其危险.大家说下平常工作中对绑定变量的使用

解决方案 »

  1.   

    在大型的生产系统中,这种做法尤其危险
    --------
    楼主能举个例子吗?在循环中使用绑定变量可以提高性能的
    使用绑定变量可以减少Oracle对语句的硬分析,加快语句的执行
    在实际中没用过绑定变量,学习!
      

  2.   

    最简单的例子:
    ...
    iServiceID number;
    begin
      ...
      select * from service where ServiceID = iServiceID;
      ...
    end;在实际应用中,这些都需要注意的
      

  3.   

    ColinGan(浪子)说的是静态绑定,我找了个动态绑定的例子
    declare 
      l_number number;
    begin
      for i in 1..10000
      loop 
        l_number:=dbms_random.random;
        execute immediate 'insert into t values(:x1,:x2,:x3,:x4)' using l_number,l_number,l_number,i;
      end loop;
      commit;
    end;
    /
      

  4.   

    呵呵,移动的生产系统,shared_pool=800M,数据库重启后2天,shared_pool只有reseverd的尺寸50M了.我把v$sqlarea的文本统计下,发现80%的空间都被两个insert占据了,它们没有使用绑定
    变量,都是由application program对ID从1~N取值
      

  5.   

    我在处理一次数据导入的循环代码中,
          sql_str := ('update '||v_tblname||' t2 set a'||v_colnum||' = (:1)  where t2.datatime = (:2)');    
           execute immediate sql_str using v_ei2(i),v_starttime;:1  处是具体数值,:2处是具体时间。在没有用binding的时候,执行一天的数据需要3个半小时左右,使用绑定变量的写法,运行时间缩短到10分钟左右。—— 因为通过数据库监控软件,我发现共享池报警,出现效率瓶颈的在于过多重复的解析 'update '||v_tblname||' t2 set a'||v_colnum||' = (:1)  where t2.datatime = (:2)  这个语句—— 用绑定之后,就避免重复解析问题了。
      

  6.   

    是啊,当没有绑定的时候,SQL被重复的检析,同时挤走了其他在shared_pool中的SQL,可谓损人不利己.
    大家继续补充自己的案例