2013-03-01 18 views
1

我在編寫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_TABLEDESTINATION_TABLEREQUEST_DETAILS_TABLE並留下您的SQL由於是查詢

+1

你可以發佈你正在設法優化原始查詢?您可以優化原始查詢而不是創建函數。如果你仍然想使用單獨的功能檢查Oracle管道功能 – 2013-03-01 15:13:47

+0

剛做過。實際上,我爲這一切使用了一個函數。感謝您的建議。 – 2013-03-01 17:08:37

+0

你真的有三種不同的結果集嗎?或者你真的只需要一個結果集? – 2013-03-01 18:41:59

回答

0

所以...... 我發現這個方法似乎是不夠的效率:

首先,定義全球類型的數組使用。下面的代碼:

對象(record)類型:GENERIC_ID

create or replace 
TYPE "GENERIC_ID_ARRAY" IS TABLE OF "GENERIC_ID"; 

接着的

create or replace 
TYPE "GENERIC_ID" IS OBJECT(ID VARCHAR2(64)); 

可變尺寸數組,填充通過延伸在for循環中完成的()。產生的陣列可以被用作SQL請求表,使用:

TABLE(CAST(my_array_of_ids AS GENERIC_ID_ARRAY) 

感謝,

0

。所有三個查詢都將進行優化,並且運行速度與匹配REQUEST_ID值的表一樣快。

+0

這會幫助我想。但是,我傾向於避免創建太多索引,因爲數據庫已經被嚴格查詢。增加3個索引會使我的應用程序變慢。 此外,查詢可能已經在SUBMIT_DATE以外的字段上。 STATUS,例如不存在於DESTINATION_TABLE中。這種情況會迫使我得到所有請求具有該狀態的REQUEST_ID。 – 2013-03-02 00:37:21

+0

我同意 - 因爲您必須通過其他值查詢,索引不是正確的解決方案。在這種情況下,我會推薦上面提到的流水線解決方案。這不是我的強項,所以我恐怕不能提供太多的幫助,但你會在網上找到大量的例子。祝你好運:) – 2013-03-03 23:48:13

+0

感謝您的幫助。 :) – 2013-03-06 13:47:32