create or replace package pkg_public_int is  type type_ref_cur is ref cursor;  procedure mytest
  (
    num in integer,
    o_cursor out type_ref_cur
  );end;
create or replace package body pkg_public_int is  procedure mytest
  (
    num in integer,
    o_cursor out type_ref_cur
  )is
    v_sql varchar2(32760);
    v_sql1 varchar2(32760);
    my_num integer := 0;
  begin
    loop
      v_sql := v_sql ||','|| my_num ||' as t_'|| my_num;
      
      v_sql := v_sql ||','|| my_num ||' as t_'|| my_num;
      my_num := my_num +1;
      exit when my_num > num;
    end loop;
    
    open o_cursor for
    'select 1 f1 '||v_sql || v_sql1|| ' from dual';
  end;end;
-----------------------如上所示的package定义中,mytest过程给定参数超过一定值的话就会报错;
原因好像是plsql的varchar2定义不能超过32767,
有什么办法可以实现同样的功能,同时又支持大的sql statement?

解决方案 »

  1.   

    动态sql语句总字符长度不能超过32767。
    在存储过程中向临时表中写数据,然后从临时表返回数据。
      

  2.   

    使用dbms_sql吧,v_sql, v_sql1可以用dbms_sql.varchar2a数据类型。
    TYPE varchar2a IS TABLE OF VARCHAR2(32767) INDEX BY binary_integer;
    具体使用方法,可以google一下dbms_sql。
      

  3.   

    换别的方式实现功能吧,varchar2最大就是32767
      

  4.   

    dbms_sql可以处理超过32K的动态sql语句,但是要实现你的功能,比如将数据打开到游标里的话好像要加一个中间步骤,就是写到临时表中。
    这样的话就多了一个限制,比如,临时表只能255个字段,^_^
    所以,这个有点难。