2013-12-22 32 views
0

我們遇到了使用Oracle 9i的xmldb工具編寫大型xml文件的問題。查詢產生約3萬線,而甲骨文以下錯誤提示信息:使用oracle xmldb編寫大型xmlfile時出現進程內存錯誤

ERROR at line 1: 
ORA-04030: out of process memory when trying to allocate 4012 bytes 
(qmxtgCreateBuf,kghsseg: kolaslCreateCtx) 
ORA-06512: at "....", line 1154 
ORA-06512: at line 1 
ERROR: 
ORA-00600: internal error code, arguments: [%s], [%s], [%s], [%s], [%s], [%s], 
[%s], [%s] 

在警報日誌中:

Errors in file d:/db/admin/acc1/udump/acc1_ora_8112.trc: 
ORA-00600: internal error code, arguments: [729], [104], [space leak], [], [], [], [], [] 

我們試圖增加進程的內存,但幾乎沒有任何影響。

有沒有辦法讓甲骨文使用較少的內存爲XML(一「懶體現」 /寫式開關或類似的東西?

+0

你可以嘗試在dba.stackexchange.com上發佈這個問題。我這樣說是因爲它可能是一個配置問題。 –

+0

請參閱[我對類似問題的回答](http://stackoverflow.com/a/19390910/)。 –

回答

2

你需要使用BULK操作LIMITED PAGED查詢來管理過程中消耗內存
例如:

DECLARE 
    CURSOR c_customer IS 
    SELECT CUSTOMER.id, CUSTOMER.name from CUSTOMER; 
    TYPE customer_array_type IS TABLE OF c_customer%ROWTYPE INDEX BY BINARY_INTEGER; 
    customer_array customer_array_type; 
    fetch_size  NUMBER := 5000; -- scale the value to manage memory 
BEGIN 
    -- Open(create) XML file 
    OPEN c_customer; 
    loop 
    FETCH c_customer BULK COLLECT 
     INTO customer_array LIMIT fetch_size; 
    FOR i IN 1 .. customer_array.COUNT LOOP 
     null; -- Add XML nodes 
    END LOOP; 
    EXIT WHEN c_customer%NOTFOUND; 
    END LOOP; 
    CLOSE c_customer; 
    -- Close(flush) XML file 
End; 

在某些情況下,文件大小將超過OS文件大小限制,你必須創建多個文件

相關問題