日期:2014-05-17  浏览次数:20876 次

碰到一个比较棘手的问题,动态sql超过32K
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?

------解决方案--------------------
建议使用临时表机制,而且可以提高性能。
------解决方案--------------------
动态sql语句总字符长度不能超过32767。
在存储过程中向临时表中写数据,然后从临时表返回数据。
------解决方案--------------------
使用dbms_sql吧,v_sql, v_sql1可以用dbms_sql.varchar2a数据类型。
TYPE varchar2a IS TABLE OF VARCHAR2(32767) INDEX BY binary_integer;
具体使用方法,可以google一下dbms_sql。

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

------解决方案--------------------
学习ing……………………