我在編寫SQL查詢時遇到了一些麻煩。在包函數中,我試圖在兩個其他查詢中重用查詢的結果。這是怎麼回事:在PL/SQL包中重新使用查詢結果
我的模式存儲請求。每個請求涉及多個目的地。此外,每個請求都在另一個表(Request_Detail)中詳細說明。另外,請求由他們的Id標識。
所以,我主要使用3個表格。一個用於請求,另一個用於目的地,最後一個用於細節。這些表中的每一個都由Request_Id列索引。
我想優化的查詢是當用戶想要查找所有請求以及在兩個日期之間發送的目標和命令時。
我想先查詢Request_Table以獲取所有Request_ids。然後,使用此Request_Ids列表查詢Command表和Destination表。
我無法找到如何做到這一點......我不能使用裁判遊標,因爲他們不能被提取兩次......我只需要一些類似數組或類似的變量來存儲Request_Ids ,然後用這個變量兩次或更多...
這裏是原來的查詢,我想優化:
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;
正如你看到的,我們使用相同的謂詞(也就是SUBMIT_DATE條件)的所有3個查詢。我想也許有一些方法可以通過獲取REQUEST_IDs然後在剩下的查詢中使用它們來優化它。
謝謝你聽我說!基於你貼我只是添加SUBMIT_DATE
指數REQUEST_TABLE
,DESTINATION_TABLE
和REQUEST_DETAILS_TABLE
並留下您的SQL由於是查詢
你可以發佈你正在設法優化原始查詢?您可以優化原始查詢而不是創建函數。如果你仍然想使用單獨的功能檢查Oracle管道功能 – 2013-03-01 15:13:47
剛做過。實際上,我爲這一切使用了一個函數。感謝您的建議。 – 2013-03-01 17:08:37
你真的有三種不同的結果集嗎?或者你真的只需要一個結果集? – 2013-03-01 18:41:59