oracle存储过程根据计数返回数据集

时间:2012-05-18 13:07:38

标签: oracle stored-procedures if-statement count

我们目前有一个存储过程需要执行以下操作: 如果Query1返回任何结果,则打开一个sys_refcursor游标并将其返回 其他 打开Query2的游标

目前我们对Query1的from和where子句进行count(*)并在if-else stmt中使用count。但是,这会导致query1执行两次。有没有办法优化这个?

2 个答案:

答案 0 :(得分:1)

打开query1&的光标执行真正的查询。将它包裹在BEGIN .. END块&捕获无数据发现异常。

BEGIN

-- query1 code

-- return data

EXCEPTION
   WHEN NO_DATA_FOUND THEN
   NULL;

BEGIN
-- query2 code

-- return data

END;

query2代码返回时,query2代码将运行。

答案 1 :(得分:0)

我也喜欢Phil的答案,但另一种选择是使用您正在使用的相同逻辑,但更改计数查询以使用rownum stopkey,例如:

select count(1)
into v_cnt
from some_table
where some_field like 'ABC%'
and rownum <= 1;

rownum可以允许Oracle在命中后停止计数(意味着从查询返回1行或更多行)。当然,根据数据和查询可以产生很大的不同。