Oracle 如何检查ref游标是否从pl/sql过程返回数据

Oracle 如何检查ref游标是否从pl/sql过程返回数据,oracle,plsql,cursor,ref-cursor,Oracle,Plsql,Cursor,Ref Cursor,我想知道如何检查ref游标是否返回数据 假设我在PL/SQL包中有以下代码: type refcursor is ref cursor; procedure Foo(cursorresult out refcursor) is begin open cursorresult for select * from table t inner join t2 on t.id = t2.id where t.column1 is null; end; p

我想知道如何检查ref游标是否返回数据

假设我在PL/SQL包中有以下代码:

type refcursor is ref cursor;

procedure Foo(cursorresult out refcursor) is
begin
  open cursorresult for
    select *
      from table t
      inner join t2 on t.id = t2.id
     where t.column1 is null;
end;

procedure DoSomeghingIfFooHasResults is
  curFoo refcursor;
  begin
    Foo(curSansOwner);
    if curFoo%found then
      -- Do something
    end if;
end function;
此代码用于更复杂的流程,而Foo中的查询使用多个表

我需要在asp.net应用程序中从Foo返回的数据,但是当Foo找到一些数据时,我还需要做一些事情

我想在一些地方重用查询,但我认为这不是视图的好选择

如果Foo发现了什么,最好的方法是什么


谢谢。

要知道它是否找到了什么东西,唯一的办法就是从中取出:

procedure DoSomeghingIfFooHasResults is
  curFoo refcursor;
  recFoo mytable%ROWTYPE;
  begin
    Foo(curFoo);
    fetch curFoo into recFoo;
    if curFoo%found then
      -- Do something
    end if;
end function;

问题是我不能使用%ROWTYPE,因为我的数据来自真实进程中的许多表。编辑代码示例以反映您不能一般地这样做,我同意-事实上,您可能不能做您想要的事情。do something代码必须知道它将要使用的数据的结构,因此它必须注意游标不返回任何行的情况。您可以声明要提取的记录类型,与基础查询中的预期输出字段类型相匹配。希望您已经简化了,但使用*并不理想;除此之外,还有两列名为ID。dosomething部分仅用于在特殊情况下报告一些信息。我觉得要复制记录结构有点奇怪。这意味着,如果查询发生更改,当我只想检查它是否返回数据时,我必须更新记录结构。也许是我太反对重复,但对我来说,我必须重复这个结构似乎是错误的。@Martin:好的,你不能使用%ROWTYPE,那么你必须使用到变量1,变量2。。。因此,Foo返回的游标需要一个真正的字段列表,而不仅仅是*。