3

我正在编写一个 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 中完成相同的任务。

4

2 回答 2

8

您可以利用 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 行。

于 2012-10-19T19:39:36.737 回答
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;
于 2012-10-19T19:40:01.133 回答