1

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

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

4

2 回答 2

1

打开 query1 的游标并执行真正的查询。将其包装在 BEGIN .. END 块中并捕获未找到数据的异常。

BEGIN

-- query1 code

-- return data

EXCEPTION
   WHEN NO_DATA_FOUND THEN
   NULL;

BEGIN
-- query2 code

-- return data

END;

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

于 2012-05-18T14:21:02.273 回答
0

我也喜欢 Phil 的回答,但另一种选择是使用您正在使用的相同逻辑,但将计数查询更改为使用 rownum 停止键,例如:

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

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

于 2012-05-18T15:24:43.913 回答