2016-06-07 69 views
1

我遇到了一個錯誤,使用SQL * Loader將文本文件中的XML文檔加載到Oracle表中。加載XML數據時出現錯誤,說我的控制文件「引用了一個不存在的字段」

我已經創建了一個XML表:

CREATE TABLE TEST_XML OF XMLTYPE 
XMLTYPE STORE AS SECUREFILE BINARY XML; 

而且我有一個文件test_file.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_loading.ctl

LOAD DATA 
INFILE "test_file.xml" 
append INTO TABLE TEST_XML 
xmltype(XMLDATA) 
(
    XMLDATA LOBFILE("test_file.xml") TERMINATED BY EOF 
) 

當我運行使用該控制文件的SQL * Loader:

sqlldr username/password control=/path/test_loading.ctl 

它返回與以下錯誤:

SQL*Loader-416: SDF clause for field XMLDATA in table TEST_XML_ARUN references a non existent field.

我在做什麼錯?

回答

0

你似乎混淆了一些做法。該錯誤是因爲它試圖將LOBFILE()中的"test_file.xml"解釋爲字段參考。

如果你知道你將只從單一的文本文件中加載一個XML文檔,你可以讓你的控制文件:

LOAD DATA 
INFILE * 
append INTO TABLE TEST_XML 
XMLType(XMLDATA) 
FIELDS 
(
    FILL FILLER CHAR(1), 
    XMLDATA LOBFILE(CONSTANT test_file.xml) TERMINATED BY EOF 
) 
BEGINDATA 
0 

BEGINDATA部分具有對文件中的每個XML文檔填充字符的行,因爲只有一個,所以只有一個填充物。

請注意CONSTANT,它使它尋找一個名爲的文件,而不是字段。該日誌文件顯示靜態名稱:

Table TEST_XML, loaded from every logical record. 
Insert option in effect for this table: APPEND 

    Column Name     Position Len Term Encl Datatype 
------------------------------ ---------- ----- ---- ---- --------------------- 
FILL        FIRST  1   CHARACTER 
    (FILLER FIELD) 
XMLDATA       DERIVED  * EOF  CHARACTER 
    Static LOBFILE. Filename is test_file.xml 


Table TEST_XML: 
    1 Row successfully loaded. 
    0 Rows not loaded due to data errors. 
    0 Rows not loaded because all WHEN clauses were failed. 
    0 Rows not loaded because all fields were null. 

要使用現場你將不得不與文件名的數據文件,讓我們把它叫做test_loading.dat相匹配的控制文件名,其中包含:

test_file.xml 

以及使用,作爲INFILE,其第一場的作爲文件名的內容的控制文件:

LOAD DATA 
INFILE test_loading.dat 
append INTO TABLE TEST_XML 
XMLType(XMLDATA) 
FIELDS 
(
    filename FILLER CHAR(30), 
    XMLDATA LOBFILE(filename) TERMINATED BY EOF 
) 

這一次日誌文件顯示的名稱被動態檢索:

Table TEST_XML, loaded from every logical record. 
Insert option in effect for this table: APPEND 

    Column Name     Position Len Term Encl Datatype 
------------------------------ ---------- ----- ---- ---- --------------------- 
FILENAME       FIRST 30   CHARACTER 
    (FILLER FIELD) 
XMLDATA       DERIVED  * EOF  CHARACTER 
    Dynamic LOBFILE. Filename in field FILENAME 


Table TEST_XML: 
    1 Row successfully loaded. 
    0 Rows not loaded due to data errors. 
    0 Rows not loaded because all WHEN clauses were failed. 
    0 Rows not loaded because all fields were null. 

Read more in the documentation

兩者都適合你。由於在示例中只有一個文件,所以第一個版本可能會稍微簡單一些,但是如果您要加載多個文件(每個文件使用一個表格行),則第二個版本更有用。

+0

第一種方法工作正常,非常感謝。 – Kumar

相關問題