3

データベース クエリの結果を返す Oracle ストアド プロシージャを作成しています。クエリが結果を生成しない場合は、代わりに 2 番目のクエリを実行する必要があります。

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

答えは、クエリの結果をさらにどのように使用するかによって大きく異なります。したがって、pipeled 関数を使用するか、GTT に挿入するか、ref カーソルを返す必要があります。

いずれにせよ、読み取りの一貫性を実現するために、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 に答える