我们目前有一个存储过程需要执行以下操作: 如果Query1返回任何结果,则打开一个sys_refcursor游标并将其返回 其他 打开Query2的游标
目前我们对Query1的from和where子句进行count(*)并在if-else stmt中使用count。但是,这会导致query1执行两次。有没有办法优化这个?
答案 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行或更多行)。当然,根据数据和查询可以产生很大的不同。