PLSQL如果First为空,则使用ref cursor执行另一个Select语句

时间:2014-08-08 14:02:09

标签: sql oracle plsql

我正在尝试做类似以下的事情:

procedure some_name ( p_ref_cursor in out nocopy sys_refcursor )

is

begin

open p_ref_cursor for
select item1, item2 from (some complicated join query);

fetch p_ref_cursor into xx;
if p_ref_cursor%NOTFOUND
then
select item1, item2 from table2 where item3='y';
end if;

end

如果第一个select语句没有返回任何内容,它应该执行第二个select语句来检索值。我遇到的问题是当提取光标时,结果集被清除。因此,无论第一个select语句是否找到任何内容,它都会像找不到它一样。

我尝试了以下内容:

procedure some_name ( p_ref_cursor in out nocopy sys_refcursor )

is
local_var1 number
local_var2 number
begin

open p_ref_cursor for
select item1, item2 
into local_var1, local_var2
from (some complicated join query);

if local_var1 is null
then
select item1, item2 from table2 where item3='y';
end if;

end

然而,看起来INTO语句不能与ref cursor一起使用。

谢谢, 丹

1 个答案:

答案 0 :(得分:1)

对于我认为应该有用的东西来说,这似乎有些过分。但我相信它可以解决问题,并消除你的if语句的需要。此外,它可能会稍微慢,因为它必须进行两个查询。因此,如果性能是最重要的,那么我就不会使用它。

WITH CTE AS
(SELECT item1, item2, '1' as Src 
FROM (some complicated join query)
UNION
SELECT item1, item2, '2' as SRC
FROM table2 where item3='y')
SELECT item1, item2
FROM CTE
WHERE src = (Select min(src) from cte)