在Oracle表中使用fn:string-join加载XML后拆分查询结果

问题描述 投票:1回答: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()并没有真正解决它。.

oracle xmltype
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.