碰到一个比较棘手的问题,动态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……………………