我有一個TDATAMAP表,它擁有大約1000萬條記錄,我想將所有記錄提取到一個PL/SQL表類型變量中,並將其與一些條件匹配,並最終將所有需要的記錄插入到一個登臺表中。請告訴我,如果它可能使用PL/SQL表的類型變量和BULK INSERT/COLLECT。我也關心代碼的性能。如何將數據插入到PL/SQL表類型而不是PL/SQL表中?
3
A
回答
7
只要有足夠的內存來保存那麼多,你可以,但你可能不應該一次加載1000萬條記錄到內存中。通常BULK COLLECT與LIMIT子句一起使用以一次處理有限數量的行,例如, 1000
的BULK COLLECT子句允許您從結果 集,或整個結果集一次獲取整個列。下面的例子中,從 光標檢索列到收集:
DECLARE
TYPE NameList IS TABLE OF emp.ename%TYPE;
names NameList;
CURSOR c1 IS SELECT ename FROM emp WHERE job = 'CLERK';
BEGIN
OPEN c1;
FETCH c1 BULK COLLECT INTO names;
...
CLOSE c1;
END;
以下示例使用LIMIT子句。對於循環的每次迭代 ,FETCH語句會將100行(或更少)讀取到索引 表acct_ids中。以前的值被覆蓋。
DECLARE
TYPE NumList IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
CURSOR c1 IS SELECT acct_id FROM accounts;
acct_ids NumList;
rows NATURAL := 100; -- set limit
BEGIN
OPEN c1;
LOOP
/* The following statement fetches 100 rows (or less). */
FETCH c1 BULK COLLECT INTO acct_ids LIMIT rows;
EXIT WHEN c1%NOTFOUND;
...
END LOOP;
CLOSE c1;
END;
8
「我希望所有的記錄讀取到PL/SQL表類型變量, 一些標準的比賽,並最終在一個臨時表中插入所有需要的 記錄。」
這可能不是正確的做法。 SQL是基於集合的編程語言的。它具有使我們能夠識別和處理我們想要的一組記錄的功能。
因此,而不是一個三個階段的過程 - 提取物,過濾器,插入 - 慶祝套的喜悅:
insert into your_staging_table
select whatver
from your_10m_table
where something = your_matching_criteria;
會有場景時,這是不夠好。但這是開始的方法。
相關問題
- 1. 插入到嵌套表plsql
- 2. PLSQL變量插入
- 3. PLSQL動態插入
- 4. 如何使用遊標插入到嵌套表集合plsql
- 5. 數據插入使用SQL/PLSQL
- 6. 在PLSQL中批量插入而不是循環?
- 7. plsql:使用集合將數據從一個表插入另一個表
- 8. PLSQL嵌套表
- 9. 更新表列後插入到相同的表-PLSQL
- 10. PLSQL根據輸入
- 11. 如何在sql查詢中使用plsql表類型?
- 12. plsql-使用動態表名插入數據表格2個表給出錯誤
- 13. 將Oracle對象類型參數的值傳遞給PLSQL表類型參數
- 14. 通過plsql過程顯示錶數據
- 15. 在plsql中寫入函數
- 16. Self加入PLSQL
- 17. PLSQL讀輸入
- 18. 無法從函數返回表類型PLSQL
- 19. plsql比較兩個不同數據庫中表的結構
- 20. plsql-從其他表格數據中提取表格
- 21. plsql
- 22. 將數據插入到Postgres的表,如果數據不是空
- 23. PLSQL中的(+)函數
- 24. PLSQL:可能在SQLPLUS中使用BOOLEAN數據類型?
- 25. 在PLSQL中檢索列名和數據類型
- 26. 如何從PLSQL獲取表用戶定義類型作爲出參數?
- 27. 如何使用PLSQL程序從文本文件插入Oracle 10g中的表格?
- 28. 如何通過PLSQL
- 29. plsql解析來自文本文件的輸出並插入表
- 30. PLSQL修改VARCHAR2列數據
你是指什麼「完全符合一些標準」?我認爲有一種更好的方式來做你想做的事,但沒有足夠的信息來說明。你能給一些示例代碼嗎? – tbone 2012-02-10 12:12:30