1

我已将一些 XML 文件加载到 Oracle 数据库(Linux x64 上的 11gr2)中,我必须使用 fn:string-join 成功导入包含多条记录的 xml 文件。

在使用 SQL*LOADER 将数据登陆/导入到 XMLTYPE 表后,我发出了一个查询,将 XML 数据从 XMLTYPE 表传输到常规表,我们称之为 Table_A

该表现在在目标字段中包含导入记录的所有字段(本例中为 2 条记录),例如。

xml 文件包含 computer_brand 的条目,第一条记录的值为“Dell”,第二条记录的值为“Apple”。现在 XML 文件中的两条记录已被选择/插入到 Table_A 但位于同一字段中,用分号分隔。字段名称:computer_brand 值:Dell;Apple

我想做的是从表中选择单独的值(不管字段中不同值的数量,因为此查询需要从计划的作业中运行)并将它们传递给它们自己的所有值单独的字段。


这是我制作/使用的东西的一个例子:


Table_A 元数据:

CREATE TABLE table_a
(
computer_brand                           varchar2(41),
owner                                    varchar2(101),
address                                  varchar2(101),
serialnumber                             varchar2(21)
)

我使用以下查询选择并插入从 xmltype 表导入的数据到 Table_A 中:

insert into table_a
(computer_brand,
 owner,
 address,
 serialnumber
)
select
 a.computer_brand,
 a.owner,
 a.address,
 a.serialnumber
from table_xml a,
 xmltable (xmlnamespaces('not mentioned due to security reasons' as "tns"),
 '//tns:Main' passing a.xml_file
 columns
 computer_brand      varchar2(41)  path 'fn:string-join(tns:/@computer_brand,";")',
 owner               varchar2(101) path 'fn:string-join(tns:/@owner,";")',
 address             varchar2(101) path 'fn:string-join(tns:/@address,";")',
 serialnumber        varchar2(21)  path 'fn:string-join(tns:/serialnumber,";")')
(+) k
where upper(file_name)=upper('xmlfile.xml');

上述查询的输出是:

computer_brand
--------------
dell;apple

owner
--------------
pete;jack

address
--------------
basement;attic

serialnumber
--------------
123444;456555

如果有人知道如何提供帮助,请提前非常感谢?我在看SUBSTR()并没有真正设法解决它..

4

1 回答 1

0

这就是字符串连接应该做的:它连接匹配 XPath 的值。因此,实际上您要查找的只是没有字符串连接的查询。我不确切知道您的 XML 是什么样的,但我建议尝试这样的 SQL:

insert into table_a
(computer_brand,
 owner,
 address,
 serialnumber
)
select
 a.computer_brand,
 a.owner,
 a.address,
 a.serialnumber
from table_xml a,
 xmltable (xmlnamespaces('not mentioned due to security reasons' as "tns"),
 '//tns:Main' passing a.xml_file
 columns
 computer_brand      varchar2(41)  path 'tns:/@computer_brand',
 owner               varchar2(101) path 'tns:/@owner)',
 address             varchar2(101) path 'tns:/@address)',
 serialnumber        varchar2(21)  path 'tns:/serialnumber')
(+) k
where upper(file_name)=upper('xmlfile.xml');
于 2020-02-12T11:41:04.937 回答