2016-06-07 112 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

相关问题