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

Posted

技术标签:

【中文标题】如何检查 ref 游标是不是从 pl/sql 过程返回数据【英文标题】:how to check if a ref cursor returns data from a pl/sql procedure如何检查 ref 游标是否从 pl/sql 过程返回数据 【发布时间】:2010-10-28 15:26:50 【问题描述】:

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

假设我在 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 是否找到了什么最好的方法是什么?

谢谢。

【问题讨论】:

【参考方案1】:

知道它是否找到了什么的唯一方法是从中获取:

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 因为我的数据来自我真实过程中的许多表。编辑代码示例以反映这一点 你不能做一般我同意 - 事实上你可能不能做你想做的事。 “做某事”代码必须知道它要使用的数据的结构,因此它必须处理游标不返回任何行的情况。 您可以声明要提取的记录类型,匹配来自底层查询的预期输出字段类型。 (希望您已经简化,但使用 * 并不理想;除此之外,您还有两列称为 ID)。 do something 部分仅用于在特殊情况下报告一些信息。我觉得我必须复制记录结构有点奇怪。这意味着如果查询发生变化,当我只想检查它是否返回数据时,我将不得不更新记录结构。也许是我太反对重复了,但对我来说,我必须重复结构似乎是错误的。 @Martin:好的,你不能使用 %ROWTYPE - 那么你必须使用“INTO var_1, var_2, ... var_etc”。因此 Foo 返回的光标需要有一个“真实”的字段列表,而不仅仅是“*”。

以上是关于如何检查 ref 游标是不是从 pl/sql 过程返回数据的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 游标简介

oracle游标的使用

PL/SQL 打印出存储过程返回的引用游标

如何在 Oracle PL/SQL 过程的开始部分之后声明游标

从存储过程中调用 PL/SQL 游标得到结果

在 PL SQL 中返回游标的函数,