2014-03-26 48 views
1

我在將非常大的XML文件加載到Oracle DB(80MB)時遇到問題。 XML文件是這樣的:我試圖讓它工作將大型XML文件導入/加載到Oracle

<?xml version="1.0" encoding="utf-8"?> 
<names> 
<catalog> 
<row> 
<col name="NAME">John</col> 
<col name="SURNAME">Smith</col> 
<col name="AGE">24</col> 
</row> 
<row> 
<col name="NAME">Matt</col> 
<col name="SURNAME">Lick</col> 
<col name="AGE">14</col> 
</row> 
</catalog> 
</names> 

代碼如下所示:(我等待4H的請求結束)

CREATE directory TEST_DIR AS 'c:\Test'; 

INSERT INTO NAMES(NAME,SURNAME,AGE) 
WITH t AS (SELECT xmltype(bfilename('TEST_DIR','NAMES.xml'), nls_charset_id('UTF8'))  xmlcol FROM dual) 
SELECT extractValue(value(x),'/row/col[@name="NAME"]') NAME   
,extractValue(value(x),'/row/col[@name="SURNAME"]') SURNAME 
,extractValue(value(x),'/row/col[@name="AGE"]') AGE 

FROM t,TABLE(XMLSequence(extract(t.xmlcol,'/names/catalog/row'))) x; 

我得到的是無限循環當我嘗試使用一個小的文件,如40MB,它的工作原理 - 我得到的信息是在253s中插入了160 000條記錄。 是否有任何參數或可以使此導入工作以及更大的文件?我做錯了什麼?

歡呼聲

回答

0

的XML被解析上DOM(文檔對象模型)的方法,當使用的功能,如extractValuexmltype。這會在記憶中造成巨大的開銷,一旦我讀到10-20因子!一般來說,使用DOM解析器解析XML文檔是不明智的,如果它們比我們說的「兩位數的上限MB」更大。

對於大文檔,您必須使用基於流的解析器,通常是SAX解析器。在大多數情況下,編碼更多,但是您的文檔結構非常簡單,所以它應該沒有問題。

在我的應用程序中,我必須將高達1 GB的XML文件加載到我的Oracle DB中,我使用XML::Twig在Perl中編寫了解析器,它的工作原理非常好。

+0

感謝您的幫助!我編寫了一些STAX Java解析器,它工作得非常快速而且流暢!謝謝 – user3464862

0

存儲爲安全文件binary xml,以便您獲得它提供的優化。

CREATE TABLE xxx (xml_file XMLTYPE) XMLTYPE xml_file STORE as securefile binary xml; 

INSERT INTO xxx (xml_file) 
(SELECT XMLTYPE(bfinename(<directory object>,<file name>, nls_charset_id(<character set>)) from dual); 

這裏我建議改變< col name =「???」 >至<???> </??? >在xml中讓您的生活更輕鬆。

SELECT name, surname, age 
FROM XMLTABLE('/names/catalog/row' passing (SELECT xml_file FROM xxx) 
       COLUMNS name VARCHAR2(4000), 
         surname VARCHAR2(4000), 
         age NUMBER);