Oracle 加载XML数据时出错,显示“我的控制文件”;引用一个不存在的字段;

Oracle 加载XML数据时出错,显示“我的控制文件”;引用一个不存在的字段;,oracle,sql-loader,xmltype,Oracle,Sql Loader,Xmltype,使用SQL*Loader将XML文档从文本文件加载到Oracle表时出错 我创建了一个XML表: CREATE TABLE TEST_XML OF XMLTYPE XMLTYPE STORE AS SECUREFILE BINARY XML; 我有一个文件test\u file.xml: <ROWSET> <ROW> <ID>1</ID> <TEXT>This is some text</TEXT> </ROW>

使用SQL*Loader将XML文档从文本文件加载到Oracle表时出错

我创建了一个XML表:

CREATE TABLE TEST_XML OF XMLTYPE
XMLTYPE STORE AS SECUREFILE BINARY XML;
我有一个文件
test\u 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>
当我使用该控制文件运行SQL*Loader时:

sqlldr username/password control=/path/test_loading.ctl
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
它返回时出现以下错误:

表TEST_XML_ARUN中字段XMLDATA的SQL*Loader-416:SDF子句引用了一个不存在的字段


我做错了什么?

你似乎混淆了几种方法。错误是因为它试图将
LOBFILE()
中的
test\u file.xml“
解释为字段引用

如果您知道将只从单个文本文件加载一个XML文档,则可以使控制文件:

sqlldr username/password control=/path/test_loading.ctl
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文档都有一个填充字符,因为只有一个,所以只有一个填充字符

请注意
常量
,它使它查找名为该文件的文件,而不是字段。日志文件显示静态名称:

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\u loading.dat
,以匹配控制文件名,其中包含:

test_file.xml
以及一个控制文件,使用该文件作为内嵌,其第一个字段的内容作为文件名:

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.

这两种方法都适用于你。由于您的示例中只有一个文件,所以第一个版本可能会稍微简单一些,但是如果您要加载多个文件(每个文件有一个表行),那么第二个版本会更有用