SQL クエリの記述に問題があります。パッケージ関数内で、クエリの結果を他の 2 つのクエリで再利用しようとしています。方法は次のとおりです。
私のスキーマはリクエストを保存します。各リクエストは複数の宛先に関係します。また、各リクエストは別のテーブル (Request_Detail) に詳述されています。さらに、リクエストは ID によって識別されます。
なので、主に3つのテーブルを使用しています。1 つはリクエスト用、もう 1 つは宛先用、最後の 1 つは詳細用です。これらのテーブルのそれぞれは、Request_Id 列によって索引付けされます。
私が最適化したいクエリは、ユーザーがすべてのリクエストに加えて、2 つの日付の間に送信された宛先とコマンドを検索したい場合です。
すべての Request_id を取得するために、最初に Request_Table を照会したいと考えています。次に、この Request_Ids リストを使用して、Command テーブルと Destination テーブルをクエリします。
その方法が見つかりませんでした... refカーソルは2回フェッチできないため使用できません... Request_Idsを格納するために配列または列のような変数が必要なだけで、これを使用します変数が 2 回以上...
最適化したい元のクエリは次のとおりです。
FUNCTION EXTRACT_REQUEST_WITH_DATE (ze_from_date DATE, ze_to_date DATE, x_request_list OUT cursor_type, x_destination_list OUT cursor_type,
x_command_list OUT cursor_type) RETURN VARCHAR2 AS
my_function_id VARCHAR2(80) := PACKAGE_ID || '.EXTRACT_REQUEST_WITH_DATE';
my_return_code VARCHAR2(2);
BEGIN
OPEN x_request_list FOR
SELECT NAME,DESTINATION_TYPE,
SUCCESS_CNT, STATUS, STATUS_DESCRIPTION,
REQUEST_ID, PARENT_REQUEST_ID, DEDUPLICATION_ID, SUBMIT_DATE, LAST_UPDATE_DATE
FROM APP_DB.REQUEST_TABLE
WHERE SUBMIT_DATE >= ze_from_date
AND SUBMIT_DATE < ze_to_date
ORDER BY REQUEST_ID;
OPEN x_destination_list FOR
SELECT REQUEST_ID, DESTINATION_ID
FROM APP_DB.DESTINATION_TABLE
WHERE SUBMIT_DATE >= ze_from_date
AND SUBMIT_DATE < ze_to_date
ORDER BY REQUEST_ID;
OPEN x_command_list FOR
SELECT SEQUENCE_NUMBER, NAME, PARAMS, DESTINATION_ID
SEND_DATE, LAST_UPDATE_DATE,PROCESS_CNT, STATUS, STATUS_DESCRIPTION,
VALIDITY_PERIOD, TO_ABORT_FLAG
FROM APP_DB.REQUEST_DETAILS_TABLE
WHERE SUBMIT_DATE >= ze_from_date
AND SUBMIT_DATE < ze_to_date
ORDER BY REQUEST_ID, DESTINATION_ID, SEQUENCE_NUMBER;
return RETURN_OK;
END EXTRACT_REQUEST_WITH_DATE;
ご覧のとおり、3 つのクエリすべてに同じ述語 (SUBMIT_DATE 条件) を使用しています。REQUEST_ID を取得して残りのクエリで使用することで、最適化する方法があると思います。
聞いてくれてありがとう!