有这个块:
declare
type restype is table of varchar2 (64);
res restype;
tabnam varchar2(200):= '&table_l' ;
colnum int;
colnam varchar2 (32) := &column_l;
begin
select column_name into colnam
from all_tab_columns
where owner||'.'||table_name = upper (tabnam)
and column_id = colnam;
EXECUTE IMMEDIATE 'select '||colnam||' from '||tabnam bulk collect into res;
for i in 1..res.count loop
dbms_output.put_line (res(i));
end loop;
end;
此查询返回由参数(表 + 列号)指定的列的所有行。问题是行数过多,超出了缓冲区限制。
有没有办法解决这个问题?
也许根据这个请求创建一个函数会有所帮助?
在这种情况下,创建一个批处理流水线函数。它可以通过 SQL 查询调用,结果集将由发送查询的客户端以小块的形式获取。
假设有一个包含 1M 记录的表(缓冲区溢出需要更多,但仅作为示例;由于站点限制,在db<>fiddle上有 100K 记录):
包实现示例:
请求及其结果:
除了上面的答案,我做了一个单独的piplined函数,它基本上输出了我想要的:
您可以检查db<>fiddle。