2012-08-31 102 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