"t_command:='select :1 from tab_test where col1=1';  --不可以 "1.不是不可以,是因为你在execute immediate t_command into value漏了using col_2,
2.是绑定变量不是绑定字段,你对绑定“变量”的含义没搞透,
  上句就与:select 常数 from XXX 类似,你的字段.....建议查询动态SQL的参考书

解决方案 »

  1.   

    上面写错了
    execute immediate t_command into value using col_2
    也是不行,
    而且用 DBMS_SQL包也是一样的问题
      

  2.   

    SQL> create table tab_test (
      2  col1    number,
      3  col2    number);表被创建SQL> 
    SQL>  insert into tab_test values (1, 1001);1 行 已插入SQL>    insert into tab_test values (2, 1002);1 行 已插入SQL>    insert into tab_test values (3, 1003);1 行 已插入SQL>    insert into tab_test values (4, 1004);1 行 已插入SQL> set serveroutput on;
    SQL> declare
      2     --col_1     varchar2(20);
      3     col_2     varchar2(20);
      4     t_command   varchar2(100);
      5     value       varchar2(100);
      6  begin
      7     col_2:='COL2';
      8     t_command:='select :1 from tab_test where col1=1';  --不可以
      9     --t_command:='select '||col_2||' from tab_test where col1=1';    --可以    -
     10     execute immediate t_command into VALUE using col_2;
     11     dbms_output.put_line(value);
     12  end;
     13  /
    COL2PL/SQL 过程成功完成SQL>
      

  3.   

    我试过的,可以的,就相当于没选择表里的字段,而是选择了常数“COL_2”,即
    SQL> SELECT 'COL_2'  FROM TAB_TEST WHERE COL1=1;'COL_
    -----
    COL_2已选择 1 行。
    试验如下:
    -------------------------------------------------------SQL> SELECT * FROM TAB_TEST;      COL1       COL2
    ---------- ----------
             1       1001
             2       1002
             3       1003
             4       1004已选择4行。
    SQL> ED
    已写入文件 afiedt.buf  1  declare
      2     --col_1     varchar2(20);
      3     col_2     varchar2(20);
      4     t_command   varchar2(100);
      5     value       varchar2(100);
      6  begin
      7     col_2:='COL2';
      8     t_command:='select :1 from tab_test where col1=1';  --不可以
      9     --t_command:='select '||col_2||' from tab_test where col1=1';    --可以    -
     10     execute immediate t_command into value USING COL_2;
     11     dbms_output.put_line(value);
     12* end;
    SQL> /
    COL2PL/SQL 过程已成功完成。
      

  4.   

    大家打印出来的都是 COL2 不觉得有问题吗?
    要是按 t_command:='select '||col_2||' from tab_test where col1=1';
    结果是   1001
    其实要的结果就是 1001
    很明显用  t_command:='select :1 from tab_test where col1=1';
    实际上是  select ‘COL2’ from tab_test where col1=1 传递的是
    字符,不是变量的内容
      

  5.   

    而这样
    declare
    col_1 varchar2(20);
    --col_2 varchar2(20);
    t_command varchar2(100);
    value varchar2(100);
    begin
    col_1:=1;
    t_command:='select col2 from tab_test where col1=:1'; --不可以
    --t_command:='select '||col_2||' from tab_test where col1=1'; --可以 -
    execute immediate t_command into value using col1;
    dbms_output.put_line(value);
    end;
    1001
    这里用 where col1=:1 这样绑定就没问题
    为什么绑顶字段,表的时候 用USING 传递的是变量名'COL2'
    要是绑定的是值时就传递变量内容  1
    大家帮我一起思考一下
      

  6.   

    建议从sql查询的执行过程去思考绑定变量的本意是重复利用SQL共享池,减少语法、结构相同的SQL语句的解析次数。sql语句先解析后执行。绑定变量只是在SQL语句解析后,执行时才把变量的值传递过去,你上述的本意是把字段作为变量,这样在解析时Oracle就不知道你要查什么字段,
    是否符合数据字典的要求,是否有查询此字段的权限...只好用了一个占位符,
    直到执行时才把占位符换成了'col_2'....反正我是这么理解的,不知道是不是把你说糊涂了,呵呵...
      

  7.   

    有道理,没其他跟有说服力的就照njhart2003()说的理解了