Oracle SQL*加载器能否处理XML?
Oracle是否提供XML格式文件的标准化上载? 我认为用于XML输出的规范格式structure=ROWSET/ROW/columname可以通过使用适当的控制文件内容运行sqlldr再次上传回表中。Oracle SQL*加载器能否处理XML?,xml,oracle,upload,sql-loader,Xml,Oracle,Upload,Sql Loader,Oracle是否提供XML格式文件的标准化上载? 我认为用于XML输出的规范格式structure=ROWSET/ROW/columname可以通过使用适当的控制文件内容运行sqlldr再次上传回表中。 但我在web上的任何地方都找不到关于这一点的任何信息,试用后的错误消息似乎表明,只有将XML上传到XML类型的格式化表中才可能,在这种情况下,我只想上传普通表中的数据,但提供XML格式的数据。不,SQL*Loader只能处理平面文件 一种选择是编写XSLT转换,将行集/行/列格式转换为文本文件,
但我在web上的任何地方都找不到关于这一点的任何信息,试用后的错误消息似乎表明,只有将XML上传到XML类型的格式化表中才可能,在这种情况下,我只想上传普通表中的数据,但提供XML格式的数据。不,SQL*Loader只能处理平面文件 一种选择是编写XSLT转换,将行集/行/列格式转换为文本文件,然后将其导入目标表
另一个选项是将XML导入单行,然后使用Oracle的XML函数从该暂存表中选择一个关系结果,并将其插入到实际表中。没有标准化选项,但使用此特定格式可以执行此操作。如果您有一张桌子:
CREATE TABLE test_tab (
id NUMBER,
text VARCHAR2(50)
);
以及test_tab.xml文件中的记录:
你可以做:
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
好的-那么,现在又回到使用带有正确选择的列分隔符的文件了。遗憾的是,这有点出乎意料——这是对Oracle的一个提示,在11.3中添加了此功能:-。Oracle希望有所不同:@SeanB.Durkin:这些示例是关于将XML文件或片段的内容加载到单个XMLType列中的。它不是解析XML结构并将单个标记的内容放入不同的列中。SQLLoader无法将XML:42Arthur处理为表personid,name绝对是一个不错的选择。我会记住这一点,以便以后可能使用!测试了在into table one之后添加一个append关键字,以确保将行添加到非空表中,并像一个符咒一样工作!只要XML文档包含诸如“&;之类的实体,此操作就会失败,或者。@jambjo-奇怪的是,只有当存在多个这样的实体时,它才似乎有问题,而且我不知道为什么它会有问题,因为它们是经过编码的。这仍然适用于警告,因此我认为这取决于所使用的数据类型。很好的理解,有趣的一点是,空节点是如何处理的?例如,如果你有3个?给定示例控制文件,SQLLDR将对此进行呕吐。
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
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