2012-05-18 25 views
1

我们目前有一个存储过程,需要做到以下几点: 如果查询1返回任何结果打开SYS_REFCURSOR游标为,然后返回 其他 打开的游标QUERY2的Oracle存储过程返回数据集的基础上计数

目前我们正在对Query1的from和where子句计数(*),并在if-else语句中使用count。但是,这会导致query1被执行两次。有没有一种方法来优化这个?

回答

1

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

BEGIN 

-- query1 code 

-- return data 

EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    NULL; 

BEGIN 
-- query2 code 

-- return data 

END; 

query2代码将在query1没有返回数据时运行。

0

我喜欢菲尔的回答为好,但另一种选择是使用你使用相同的逻辑,但是转换计数查询使用ROWNUM STOPKEY,如:

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

的ROWNUM可以让甲骨文停止计数一旦得到一个命中(意味着有一个或多个行从查询中返回)。当然可以根据数据和查询做出很大的改变。

相关问题