2016-01-06 72 views
2

我得到一個文件作爲輸入,並且我必須加載與文件中存在的所有ID相對應的數據[內存]。Oracle:如何過濾基於大量ID的結果[20K]

我試過了。

  • 插入標識到一個臨時表,然後做一個連接,但這是並行運行 產生的問題。意味着同一個 應用程序的多個實例不能共享相同的臨時表。在這裏,我無法爲每次執行創建一個 臨時表。

  • 'in`從句中我可以通過ID列表,但是對查詢的大小有 的限制。

我應該如何處理這個問題?

+0

可以使用該文件,就好像它是一個表?例如http://www.dba-oracle.com/art_ext_tabs_spreadsheet.htm –

回答

3

創建一個global temporary table。表定義是共享的,但每個會話都有自己的一組私有數據。

+0

我如何將插入到GTT中,以及我的主要查詢。因爲一旦陳述完成,數據將會丟失。我正在從C++的角度來談論。 – gjha

+0

當您提交事務時,數據剛剛被刪除,而不是針對每個語句(並且存在替代語法,因此在提交時它不會被刪除,如果這是您需要的)。 –

1

您可以批量加載數據。對於Oracle,IN clause的限制爲1k,因此您可以安全地按批次的500個ID裝入條目,例如。

最好的解決方案很明顯取決於您的具體情況,但這對大多數情況很適用。它不涉及寫入操作(如插入臨時表),因此不會對DB(事務日誌)施加額外的壓力,不需要清理作業,可以節省重做日誌等。

0

使用集合:

CREATE TYPE number_tt IS TABLE OF NUMBER(8,0); 
/

VARIABLE ids REFCURSOR; 
/

DECLARE 
    t_ids number_tt := number_tt(); 
BEGIN 
    -- Loop through file to get IDs 
    FOR id IN 1 .. 20000 LOOP 
    t_ids.EXTEND; 
    t_ids(t_ids.COUNT) := id; 
    END LOOP; 

    -- Use MEMBER OF instead of IN 
    OPEN :ids FOR 
    SELECT LEVEL 
    FROM DUAL 
    CONNECT BY LEVEL MEMBER OF t_ids; 
END; 
/

PRINT ids;