如何获取oracle过程中执行的所有选择查询的结果作为该过程的输出?
我的数据库中有n个表,其中表名以“test”开头(例如test1、test2等),且所有这些表都具有主键列,“id”,其中值从1开始。每个表都有10000条记录。我想获取表名以“test”开始的所有表的名称并且还将这些表中的所有记录作为该过程的输出。我已经编写了一个过程,但由于我使用的是游标,因此它只返回该过程执行的最后一个选择查询的结果。是否有其他替代方法
我当前的手术:
create or replace PROCEDURE TEST (tablenamecursor out sys_refcursor,mycursorresult out sys_refcursor
)
As
maxx number;
startindex number := 1;
strcountquery clob;
strquery clob;
strquery1 clob;
countt number;
rowcountt number;
batchsize number :=100;
tablenamequery clob;
test clob;
Begin
select count(*) into countt from user_tables where table_name like 'test_%';
loop
exit when (countt=1);
test:='test_'||countt;
tablenamequery := 'SELECT table_name FROM user_tables where table_name = '''||test||'''';
open tablenamecursor for tablenamequery;
strcountquery := 'select count(*) from "'||test||'"';
execute immediate strcountquery into maxx;
loop
exit when (StartIndex>=maxx);
strquery:='SELECT a.*, Row_number() OVER (ORDER BY "id") AS lookup FROM "'||test||'"
a WHERE "id" >='||StartIndex||' and rownum <='||batchsize;
StartIndex:= StartIndex +batchsize;
open mycursorresult for strquery;
End loop;
countt:=countt-1;
End loop;
end;
假设我有两个表(比如test1、test2、test3),那么我只能在tablenamecursor游标中得到“test1”,在mycursorresult游标中得到“test1”的最后一组100条记录。但是我需要在过程的第19和25行中以相同的顺序将选择查询的所有结果作为过程的输出。
2条答案
按热度按时间92dk7w1h1#
一个
CURSOR
实际上是一个指向数据库服务器上的内存区域的指针,该内存区域存储查询的详细信息以及您在结果集中的位置。同一游标中不能有多个结果集,如果多次打开一个游标,则它将关闭前一个游标,并使用新结果集打开新游标;这就是为什么你只得到最后一组结果(因为所有其他的结果都是打开的,然后在指针被下一个指针替换时关闭的)。您的过程存在根本性的缺陷,因为它返回的结果集不能超过过程签名中定义的两个。
您可以更改签名以返回游标数组或返回包含嵌套游标得游标.
或者,如果所有的表都有相同的结构,那么你可以使用
UNION ALL
或使用PIPELINED
函数,但是,这需要更多的细节来说明你要实现的目标。o3imoua42#
也许您可以创建一个函数,为所有(TEST_%)表生成一个单独的SQL Select命令,全部或逐个返回这些命令。下面的函数创建了一个SQL Select命令数组,并返回一个命令,这只是一个示例。为了使函数正常工作,创建了两种可变数组类型:
如果您的几个TEST表像这里一样...
...则可变数组将收集以下SQL选择:
如何使用这些命令的一些选项,您可以在(Using Dynamic SQL for Multirow Queries)...
如果所有的TEST表都有相同的列,您可以执行UNION,但情况可能并非如此。
下面是一个非常简单的代码,它使用函数(表TEST_1)并输出数据。
此致