Plsql 在循环中输入ref光标

Plsql 在循环中输入ref光标,plsql,Plsql,如何将存储过程的输出收集到SYS_REFCURSOR中, 在这样的编排过程中,getMusicanAvailability已经存在 并根据应在ref cursor中收集的输入(开始、结束)返回可用性 Create Procedure Orchestra ( Start in date; End in date; myList out SYS_REFCURSOR ) as available varchar2(3);

如何将存储过程的输出收集到SYS_REFCURSOR中, 在这样的编排过程中,getMusicanAvailability已经存在 并根据应在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,sydate+14); 它将返回结果集,逻辑上如下所示,因为数据是收集的:

musican_X, YES
musican_Y, NO
musican_Z, NO
..
或者我应该使用helper表,而不是类似于:

? 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;

如果
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;

最后,一个演奏音乐的人被称为“音乐家”而不是“音乐人”,但我没有提及你的拼写。

这个例子对你有帮助吗?:(注意到这个问题,但我需要在4分钟后离开,所以只需发布alink。)您可以创建一个调用该过程并返回可用值的函数,也可以将该过程转换为一个函数(可能是也可能不是),然后在select语句中直接调用该函数。然而,这可能不是最快的事情。另一种选择是将过程逻辑直接移动到SQL语句中。是的,现在我明白了(在深入理解游标是什么之后)。