我们目前有一个存储过程,需要执行以下操作:如果 Query1 返回任何结果,则为此打开一个 sys_refcursor 游标并将其返回,否则为 Query2 打开一个游标
目前我们正在对 Query1 的 from 和 where 子句执行 count(*),并在 if-else stmt 中使用该计数。但是,这会导致 query1 被执行两次。有没有办法优化这个?
我们目前有一个存储过程,需要执行以下操作:如果 Query1 返回任何结果,则为此打开一个 sys_refcursor 游标并将其返回,否则为 Query2 打开一个游标
目前我们正在对 Query1 的 from 和 where 子句执行 count(*),并在 if-else stmt 中使用该计数。但是,这会导致 query1 被执行两次。有没有办法优化这个?
打开 query1 的游标并执行真正的查询。将其包装在 BEGIN .. END 块中并捕获未找到数据的异常。
BEGIN
-- query1 code
-- return data
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
BEGIN
-- query2 code
-- return data
END;
当 query1 没有返回数据时,query2 代码将运行。
我也喜欢 Phil 的回答,但另一种选择是使用您正在使用的相同逻辑,但将计数查询更改为使用 rownum 停止键,例如:
select count(1)
into v_cnt
from some_table
where some_field like 'ABC%'
and rownum <= 1;
rownum 可以允许 Oracle 在命中后停止计数(意味着从查询返回 1 行或更多行)。当然可以根据数据和查询产生很大的不同。