【问题标题】: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 是否找到了什么最好的方法是什么?

谢谢。

【问题讨论】:

    标签: oracle plsql cursor ref-cursor


    【解决方案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 返回的光标需要有一个“真实”的字段列表,而不仅仅是“*”。
    猜你喜欢
    • 1970-01-01
    • 2012-05-29
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多