Oracle 加载XML数据时出错,显示“我的控制文件”;引用一个不存在的字段;
使用SQL*Loader将XML文档从文本文件加载到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>
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.
这两种方法都适用于你。由于您的示例中只有一个文件,所以第一个版本可能会稍微简单一些,但是如果您要加载多个文件(每个文件有一个表行),那么第二个版本会更有用