declare
    i number;
    j number;
    sqlstr varchar2(200);
begin
    i:=1;
    j:=2; 
    sqlstr:='insert into tabletest(f1,f2,f3,f4,f5)
    values(:x,:x,:y,:x,:x)';
      execute immediate sqlstr using i,i,j,i,i;
end;然后我怎么在别的plsql程序里面使用这些绑定变量(x,x,y,x,x)呢?绑定变量不就是让大部分的plsql程序在共享池里面共享吗?

解决方案 »

  1.   

    这位兄弟说的是否这个意思啊:
    说的是绑定变量我们定义完毕之后,我们在别的程序包体中给这个绑定变量赋值是吧,那我们赋值完毕,是否commit下,就可以执行了呢,还是需要重新写出完整的sql语句呢?
      

  2.   

    好像就是每次sql都是一摸一样需要写的吧:
    像你里面的示例:
    sqlstr:='insert into tabletest(f1,f2,f3,f4,f5)values(:x,:x,:y,:x,:x)';这种sql语句,在每次plsql程序包里面,如果我想要用绑定变量是否每次都需要这么声明定义一次呢?
      

  3.   

    你也可以用
    insert into tabletest(f1,f2,f3,f4,f5)values(:x,:x,:y,:x,:x) using 1,2,3,4,5
      

  4.   


    那怎么实现 绑定变量不就是让大部分的plsql程序在共享池里面共享 的功能呢?
      

  5.   

    [code=SQL]
    给你个列子看看,就明白了:
    create table t(cola number,colb number,colc number,cold number); 
    declare
        l_number number;
    begin
        for i in 1 .. 100
        loop
            l_number := dbms_random.random;
            execute immediate
            'insert into/*nnnn*/ t values ( ' || l_number || ',' ||
                                         l_number || ',' ||
                                         l_number || ',' ||
                                         l_number || ')';
        end loop;
        commit;
    end;
    /2.应用bind变量的例子,效率较高
    declare
     l_number number;
    begin
     for i in 1 .. 100 loop
         l_number := dbms_random.random;
         execute immediate
         'insert into/*yyyy*/  t values ( :x1, :x2, :x3, :x4 )'
           using l_number, l_number, l_number, l_number;
     end loop;
     commit;
    end;
    /SELECT COUNT(*) FROM v$sql s WHERE s.SQL_TEXT LIKE '%nnnn%';
    --102
    SELECT COUNT(*) FROM v$sql s WHERE   s.SQL_TEXT LIKE '%yyyy%';
    --4binging变量使用和不使用在v$sql中的数量是差别很大的。
    [/Quote]