如何将存储过程的输出收集到SYS_REFCURSOR中, 在像这样的编排过程中,getMusicanAvailability已经存在 并根据输入(Start,End)返回可用性,这些输入应该在ref cursor中收集。
Create Procedure Orchestra (
Start in date;
End in date;
myList out SYS_REFCURSOR
) as
available varchar2(3);
begin
for myMusican in
select ID from Musicans
loop
-- Get the indivitual availability per a Musican
getMusicanAvailability( myMusican.ID, Start, End, available );
-- Here - how to do some 'push' the data into myList?
? myList.add( myMusican.ID, available );
end loop;
end;
/
所以如果我打电话给管弦乐队(sydate,sysdate + 14); 它将返回结果集,逻辑上是这样的,因为收集了数据:
musican_X, YES
musican_Y, NO
musican_Z, NO
..
或者我应该使用帮助程序表来执行此操作,而不是像:
? myList.add( myMusican.ID, available )
我必须这样做:
insert into myListTable values ( myMusican.ID, available );
然后,使用Orchestra返回它,它应该是:
..
open myList for select * from myListTable;
return myList;
-- tidy up
delete from myListTable;
答案 0 :(得分:0)
如果getMusicanAvailability
是一个可以从SQL调用的函数(即没有输出参数并返回字符串YES或NO),你可以用以下代码轻而易举地完成
Create or replace Procedure Orchestra (
Start in date,
End in date,
myList out SYS_REFCURSOR
) as
begin
open myList for
select ID ,
getMusicanAvailability( ID, Start, End) available
from Musicans;
end;
/
但如果你已经遇到麻烦,你可以把它变成直视。
create or replace view Musican_availablility
select ID ,
getMusicanAvailability( ID, Start, End) available
from Musicans;
你也可以将你的程序包装成一个函数来实现相同的效果
Create or replace function getMusicanAvailability(
id NUMBER,
Start in date,
End in date) returns varchar2
is
available varchar2(3);
begin
getMusicanAvailability( myMusican.ID, Start, End, available );
return available;
end;
最后一个播放音乐的人被称为“音乐家”,而不是“音乐家”,但我已经单独留下你的拼写了。