如何检查 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 过程返回数据的主要内容,如果未能解决你的问题,请参考以下文章