在存储过程中:1。p_sql varchar2(1000);
2。p_sql := 'insert into ' || p_TABLE ||
             '(ID,NAME,SEQ,FLAG)VALUES (:1,:2 , :3 , :4 )';
3. execute immediate p_sql
      using p_ID, p_NAME, p_SEQ, p_FLAG;这都没问题。
我想在第2步 使用using 把p_sql 拼接完整,但是一直搜不到具体的用法。

解决方案 »

  1.   

    using是传绑定变量的值的,不是整个SQL块或含有关键字的SQL块可以使用的。
    另外还有N多的限制,就不说了
    using一般只能代替有确切SQL类型的变量,字面量,复杂表达式等。
      

  2.   

    base knowledge is very important!
      

  3.   

    谢谢dingjun123。
    其实我的目的是想得到execute immediate 执行的具体SQL语句。
    另外问个问题,按照我这种在存储过程中使用动态SQL的方法,效率会不会有什么大的问题?
      

  4.   

    using 就是绑定变量的
    使用动态的 我觉得效率要高些
      

  5.   

    我们应该寻求消除动态SQL的方法,如果你的表是确定的,那么用静态SQL吧,静态SQL可以自动使用绑定变量,比如
    declare
      v_id number:=2;
      v_name varchar2(10):='bb';
      p_seq number:=3;
      p_flag number:=4;
      
     begin
       insert into testtest values(v_id,v_name,p_seq,p_flag);
       commit;
     end;上面的变量假设是外界传入的,那么SQL完全能使用绑定变量,达到一次硬分析,以后全是软分析的目的。如果不相信可以用sql_trace跑一下,因为PLSQL中的变量是自动会转为绑定变量的。动态SQL或动态PLSQL幸好还有个绑定变量的using或dbms_sql.bin..使用,否则性能肯定很差。当然DDL就无所谓绑定变量了,因为总是硬分析,你动态SQL DDL也无法使用绑定变量using的,会报错。
    对绑定变量的详细了解,可以参考tom的oracle高效设计以及其他相关书
      

  6.   

    有一些相同结构的表的操作用动态SQL方便,而且这些表数据量非常小,结构也很简单,所以在性能上不会有太大的问题。这个帖子就结了吧,感谢几位的帮助,谢谢