2014-03-26 51 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);