2012-08-31 72 views
0

Oracle是否提供XML格式文件的标准上传? 我认为用于XML输出的规范格式structure = ROWSET/ROW/columname可以通过使用适当的控制文件内容运行sqlldr而再次上载回表中。
但我在网上任何地方都找不到任何东西,试验后的错误消息似乎表明只能将XML上载到XML格式的表格中,我只想在普通表格中上传数据,但要提供XML格式的数据。Oracle SQL * Loader可以处理XML吗?

回答

1

不,SQL * Loader只能处理“平面”文件。

一种方法是编写一个XSLT转换,将ROWSET/ROW/column格式转换为文本文件,然后将其导入到目标表中。

另一种选择是将XML导入到单个行中,然后使用Oracle的XML函数从该临时表中选择关系结果并将其插入到真实表中。

+0

OK - 所以它的背部使用的文件有适当的选择列分隔符即可。可惜并且有点意外 - 并且提示Oracle在11.3中增加这个功能:-)。 – Maestro13

+1

甲骨文有所不同:http://docs.oracle.com/cd/B19306_01/appdev.102/b14259/xdb25loa.htm和http://docs.oracle.com/cd/E11882_01/appdev.112/e23094/ xdb25loa.htm#ADXDB2900 –

+0

@ SeanB.Durkin:这些示例是关于将XML文件(或片段)的内容加载到单个“XMLType”列中的。这不是关于解析XML结构并将单个标签的内容放入不同的列中。这个XML:' Arthur'不能**被SQLLoader处理成表'person(id,name)' –

1

没有一个标准化的选项,但有了这种特定的格式,你可以做到这一点。如果你有一个表:

CREATE TABLE test_tab (
    id NUMBER, 
    text VARCHAR2(50) 
); 

而且在test_tab.xml文件的记录:

<ROWSET> 
<ROW> 
<ID>1</ID> 
<TEXT>This is some text</TEXT> 
</ROW> 
<ROW> 
<ID>2</ID> 
<TEXT>This is some more text</TEXT> 
</ROW> 
<ROW> 
<ID>3</ID> 
<TEXT>This is some other text</TEXT> 
</ROW> 
<ROW> 
<ID>4</ID> 
<TEXT>This is also some text</TEXT> 
</ROW> 
</ROWSET> 

和控制文件test_tab.ctl

LOAD DATA 
INFILE 'test_tab.xml' 
CONCATENATE 4 
INTO TABLE test_tab 
(
    dummy FILLER CHAR(15) TERMINATED BY "<ROW>", 
    id CHAR(10) ENCLOSED BY "<ID>" AND "</ID>", 
    text CHAR(40) ENCLOSED BY "<TEXT>" AND "</TEXT>" 
) 

你可以这样做:

sqlldr usr/pwd control=test_tab.ctl 

Commit point reached - logical record count 4 

SELECT * FROM test_tab; 

     ID TEXT 
---------- -------------------------------------------------- 
     1 This is some text 
     2 This is some more text 
     3 This is some other text 
     4 This is also some text 

您也可以从同一个文件中创建一个外部表,如果你把一个目录Oracle可以看到:

CREATE TABLE test_tab (
    id NUMBER, 
    text VARCHAR2(50) 
) 
ORGANIZATION EXTERNAL 
(
    TYPE ORACLE_LOADER 
    DEFAULT DIRECTORY some_dir 
    ACCESS PARAMETERS 
    (
     RECORDS DELIMITED BY "</ROW>" 
     FIELDS 
     (
      dummy CHAR(15) TERMINATED BY "<ROW>", 
      id CHAR(10) ENCLOSED BY "<ID>" AND "</ID>", 
      text CHAR(40) ENCLOSED BY "<TEXT>" AND "</TEXT>" 
     ) 
    ) 
    LOCATION ('test_tab.xml') 
) 
PARALLEL 
REJECT LIMIT UNLIMITED; 

Table created. 

SELECT * FROM test_tab; 

    ID TEXT 
---------- -------------------------------------------------- 
    1 This is some text 
    2 This is some more text 
    3 This is some other text 
    4 This is also some text 
+0

绝对是一个很好的选择。我会牢记这一点以备后用。 – Maestro13

+0

经过测试(在'into表中添加一个'append'关键字以确保行被添加到非空表中),它就像一个魅力一样! – Maestro13

+0

只要XML文档包含像“&”,“<”或“>”这样的实体,就会失败。 – jarnbjo