Declare 
        v_table varchar2(20);
        v_sql Varchar2(100);
        Begin
             v_table:='hqf.testtable';
             v_sql:='select * from '||v_table;             
             dbms_output.put_line(v_table);
             dbms_output.put_line(v_sql);
           Execute Immediate v_sql;
        End;          
Declare
       v_sid Integer:=20020101;
       v_sql Varchar2(100); 
       v_result Varchar2(50);       
Begin
     --v_sid:=12;
     v_sql:='Select loc into v_result from scott.dept d where d.deptno=:1  ';
     
     dbms_output.put_line(v_sql);
     --dbms_output.put_line(v_result);
     Execute Immediate v_sql
     Using 10 ;
     Commit;
  
End;
这是个动态语句的实例但是为什么表名不能作为绑定变量使用呢?
例如:把第一个实例给为:
Declare 
        v_table varchar2(20);
        v_sql Varchar2(100);
        Begin
             v_table:='hqf.testtable';
             v_sql:='select * from :1'e;             
             dbms_output.put_line(v_table);
             dbms_output.put_line(v_sql);
           Execute Immediate v_sql using v_table ;
        End;  
这样做的话总是提示表名无效,请问这是什么内部机制,还是我已经超出动态语句的适用范围?
那位高人能够指点一下。谢了!

解决方案 »

  1.   

    应该这么用:DECLARE
      V_TABLE VARCHAR2(20);
      V_SQL   VARCHAR2(100);
    BEGIN
      V_TABLE := 'scott.emp';
      V_SQL   := 'select * from  ' ;
      DBMS_OUTPUT.PUT_LINE(V_TABLE);
      DBMS_OUTPUT.PUT_LINE(V_SQL);
      EXECUTE IMMEDIATE V_SQL|| V_TABLE;
    END;
    /在执行execute 的时候bind变量不能用在表上。
      

  2.   

    先弄明白什么是bind变量?bind变量的作用是什么?你就明白表名是不是应该使用bind变量了。
      

  3.   

    如果表名为bind 变量,即所要查的表是不确定的,故查询计划就无法事先解释好,也许就违背了bind提高解释效率的目的。
    个人理解。
      

  4.   

    之所以使用绑定,无非是效率。
    也就是争取减少分析、解释和变异的时间,也就是说通过规范和预期,节省时间。
    如果连表名都绑定,那整个SQL都变成了不可预期的。
    那还绑个啥定呢?
    楼主要的其实是动态SQL,算然动态查询可以使用绑定,
    但是不代表只有按照使用绑定的写法才能使用动态查询。
    具体做法上面两星的兄弟貌似讲过了地说。
      

  5.   

    如果表名为bind 变量,即所要查的表是不确定的,故查询计划就无法事先解释好,也许就违背了bind提高解释效率的目的。 
    个人理解。附议