1

現在、次の処理を行う必要があるストアド プロシージャがあります。 Query1 が結果を返した場合は、そのための sys_refcursor カーソルを開き、それを返します。それ以外の場合は、Query2 のカーソルを開きます。

現在、Query1 の from 句と where 句で count(*) を実行しており、if-else stmt でカウントを使用しています。ただし、これにより query1 が 2 回実行されます。これを最適化する方法はありますか?

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;

query2コードは、query1から返されたデータがない場合に実行されます。

于 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 に答える