我得到一個文件作爲輸入,並且我必須加載與文件中存在的所有ID相對應的數據[內存]。Oracle:如何過濾基於大量ID的結果[20K]
我試過了。
插入標識到一個臨時表,然後做一個連接,但這是並行運行 產生的問題。意味着同一個 應用程序的多個實例不能共享相同的臨時表。在這裏,我無法爲每次執行創建一個 臨時表。
'in`從句中我可以通過ID列表,但是對查詢的大小有 的限制。
我應該如何處理這個問題?
我得到一個文件作爲輸入,並且我必須加載與文件中存在的所有ID相對應的數據[內存]。Oracle:如何過濾基於大量ID的結果[20K]
我試過了。
插入標識到一個臨時表,然後做一個連接,但這是並行運行 產生的問題。意味着同一個 應用程序的多個實例不能共享相同的臨時表。在這裏,我無法爲每次執行創建一個 臨時表。
'in`從句中我可以通過ID列表,但是對查詢的大小有 的限制。
我應該如何處理這個問題?
創建一個global temporary table。表定義是共享的,但每個會話都有自己的一組私有數據。
我如何將插入到GTT中,以及我的主要查詢。因爲一旦陳述完成,數據將會丟失。我正在從C++的角度來談論。 – gjha
當您提交事務時,數據剛剛被刪除,而不是針對每個語句(並且存在替代語法,因此在提交時它不會被刪除,如果這是您需要的)。 –
您可以批量加載數據。對於Oracle,IN clause
的限制爲1k,因此您可以安全地按批次的500個ID裝入條目,例如。
最好的解決方案很明顯取決於您的具體情況,但這對大多數情況很適用。它不涉及寫入操作(如插入臨時表),因此不會對DB(事務日誌)施加額外的壓力,不需要清理作業,可以節省重做日誌等。
使用集合:
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;
可以使用該文件,就好像它是一個表?例如http://www.dba-oracle.com/art_ext_tabs_spreadsheet.htm –