現在、次の処理を行う必要があるストアド プロシージャがあります。 Query1 が結果を返した場合は、そのための sys_refcursor カーソルを開き、それを返します。それ以外の場合は、Query2 のカーソルを開きます。
現在、Query1 の from 句と where 句で count(*) を実行しており、if-else stmt でカウントを使用しています。ただし、これにより query1 が 2 回実行されます。これを最適化する方法はありますか?
現在、次の処理を行う必要があるストアド プロシージャがあります。 Query1 が結果を返した場合は、そのための sys_refcursor カーソルを開き、それを返します。それ以外の場合は、Query2 のカーソルを開きます。
現在、Query1 の from 句と where 句で count(*) を実行しており、if-else stmt でカウントを使用しています。ただし、これにより query1 が 2 回実行されます。これを最適化する方法はありますか?
query1のカーソルを開き、実際のクエリを実行します。BEGIN .. ENDブロックでラップし、データが見つからないという例外をキャッチします。
BEGIN
-- query1 code
-- return data
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
BEGIN
-- query2 code
-- return data
END;
query2コードは、query1から返されたデータがない場合に実行されます。
Philの答えも好きですが、別のオプションは、使用しているのと同じロジックを使用することですが、カウントクエリを次のようにrownumストップキーを使用するように変更します。
select count(1)
into v_cnt
from some_table
where some_field like 'ABC%'
and rownum <= 1;
rownum を使用すると、Oracle がヒットするとカウントを停止できます (クエリから 1 つ以上の行が返されることを意味します)。もちろん、データとクエリに応じて大きな違いが生じる可能性があります。