将引用光标放入循环中

时间:2017-03-21 15:53:40

标签: plsql

如何将存储过程的输出收集到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;

1 个答案:

答案 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;

最后一个播放音乐的人被称为“音乐家”,而不是“音乐家”,但我已经单独留下你的拼写了。