如何解决如何使用主光标数据打开多个光标
我试图读取另一个存储过程返回的存储过程中的游标,并希望通过遍历主游标数据来写出多个游标。
-- TYPE myCursorType IS REF CURSOR;
PROCEDURE prcgetalldetails (
incustomernumber IN customer.customer_number%TYPE,accountdetailscur OUT pkgaccount.curaccountdetailstype,fundscur OUT mycursortype,otherdetailscur OUT mycursortype
) IS
localaccountdetails pkgaccount.curinvestmentaccount;
outcfunds curinvestmentaccount;
accountdetails pkgaccount.curaccountdetailstype%rowtype;
BEGIN
pkgaccount.accountdetails(incustomernumber,localaccountdetails);
LOOP
FETCH localaccountdetails INTO accountdetails;
EXIT WHEN localaccountdetails%notfound;
dbms_output.put_line(localaccountdetails.accountname
|| ','
|| localaccountdetails.accountnumber);
-- I have to return the 'accountdetailscur' as well,before that I have to loop through it and return remaining data as well
-- Based on account number I have to execute other queries and fetch other details and give those cursors back
OPEN fundscur FOR
SELECT
fundname,fundid,fundbalance
FROM
fundstable
WHERE
accountnumber = localaccountdetails.accountnumber;
OPEN otherdetailscur FOR
SELECT
col1,col2
FROM
othertable
WHERE
accountnumber = localaccountdetails.accountnumber;
END LOOP;
END;
当我循环打开游标时,它将仅返回localaccountdetails游标的最后一行详细信息。我不确定如何使用BUILK COLLECT收集所有内容并在其上循环。
而且我不知道如何以OUT数据的形式返回localaccountdetails并将其循环以获取剩余数据。
解决方法
您可以使用游标表达式将一个游标嵌套在另一个游标中。格式为:
select cursor ( select ... ) from ...
因此您可以执行以下操作:
create table par ( pk primary key ) as
select level pk
from dual
connect by level <= 5;
create table chd as
select r.c1 pk,par.pk fk
from par,lateral (
select level c1 from dual
connect by level <= pk
) r;
select pk,cursor (
select * from chd c
where par.pk = c.fk
)
from par;
declare
cursor cur is
select pk,cursor (
select * from chd c
where par.pk = c.fk
)
from par;
pk integer;
chd_cur sys_refcursor;
type chd_arr is table of chd%rowtype
index by pls_integer;
chd_recs chd_arr;
begin
open cur;
loop
fetch cur into pk,chd_cur;
exit when cur%notfound;
fetch chd_cur bulk collect into chd_recs;
dbms_output.put_line (
'Fetched ' || pk || ' child rows ' || chd_recs.count
);
end loop;
close cur;
end;
/
Fetched 1 child rows 1
Fetched 2 child rows 2
Fetched 3 child rows 3
Fetched 4 child rows 4
Fetched 5 child rows 5
请注意,这意味着您正在滚动自己的嵌套循环联接。除非您确实需要控制客户端从子表/内部表中获取多少行,否则我将其设为联接。
如果要确保从父表获得一行,可以将内部表的行聚合为JSON或嵌套表,例如:
select par.pk,json_arrayagg (
json_object ( chd.* )
)
from par
join chd
on par.pk = chd.fk
group by par.pk;
PK JSON_ARRAYAGG(JSON_OBJECT(CHD.*))
1 [{"PK":1,"FK":1}]
2 [{"PK":1,"FK":2},{"PK":2,"FK":2}]
3 [{"PK":1,"FK":3},{"PK":3,"FK":3}]
4 [{"PK":1,"FK":4},{"PK":4,"FK":4}]
5 [{"PK":1,"FK":5},{"PK":5,"FK":5}]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。