我正在编写一个Oracle存储过程来返回数据库查询的结果。如果查询没有产生任何结果,则必须在其位置运行第二个查询。
在SQL Server中,我可以使用类似于以下内容的方式完成此操作:
INSERT INTO @TableVar
SELECT <joinQuery1>;
IF (SELECT COUNT(*) FROM @TableVar) > 0
BEGIN
SELECT * FROM @TableVar; -- returns <joinQuery1>
END
ELSE
SELECT <joinQuery2>; --returns <joinQuery2>
END
但是,我无法理解如何在Oracle中完成相同的任务。
答案 0 :(得分:6)
您可以利用WITH来提高性能(并且更易于维护):
WITH query1 as (
select 1, 2
from dual
where 1=0
connect by level <= 10
),
query2 as (
select 3, 4
from dual
connect by level <= 10
)
select *
from query1
union all
select *
from query2
where not exists (
select null
from query1
);
这应该从query2返回10行。如果从query1中删除where 1 = 0(导致它实际返回行),则应该从query1获取10行。
答案 1 :(得分:0)
答案很大程度上取决于您如何进一步使用查询结果。所以你应该使用管道函数,插入GTT或返回引用光标。
无论如何,我建议你在1个SQL语句中执行它以实现读一致性。
所以请考虑类似
的内容create procedure test (pCursor out sys_refcursor) is
begin
open pCursor for
select <joinQuery1>
union all
SELECT <joinQuery2>
where not exists (select 1 from joinquery1)
;
end;