在Oracle表中加载带有fn:string连接的XML后拆分查询结果

在Oracle表中加载带有fn:string连接的XML后拆分查询结果,oracle,xmltype,Oracle,Xmltype,我已经将一些XML文件加载到Linux x64上的Oracle数据库11gr2中,并且我必须使用fn:string连接来成功导入包含多个记录的XML文件 在使用SQL*LOADER将数据导入到XMLTYPE表之后,我发出了一个查询,将XML数据从XMLTYPE表传输到一个常规表,我们将该表称为 此表现在包含导入的记录的所有字段。在本例中,目标字段中包含两条记录,例如 xml文件包含计算机品牌的条目,第一条记录的值为“Dell”,第二条记录的值为“Apple”。 现在,XML文件中的两条记录已被选

我已经将一些XML文件加载到Linux x64上的Oracle数据库11gr2中,并且我必须使用fn:string连接来成功导入包含多个记录的XML文件

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

此表现在包含导入的记录的所有字段。在本例中,目标字段中包含两条记录,例如

xml文件包含计算机品牌的条目,第一条记录的值为“Dell”,第二条记录的值为“Apple”。 现在,XML文件中的两条记录已被选择/插入到表A中,但位于同一字段中,用分号分隔。 字段名称:计算机品牌 价值观:戴尔;苹果

我想做的是从表中选择单独的值,而不考虑字段中不同值的数量,因为此查询需要从计划作业运行,并传递它们以将所有值插入各自的单独字段中

下面是我制作/使用过的东西的一个例子:

表A元数据:

CREATE TABLE table_a
(
computer_brand                           varchar2(41),
owner                                    varchar2(101),
address                                  varchar2(101),
serialnumber                             varchar2(21)
)
我选择了从xmltype表导入的数据,并使用以下查询将其插入到表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并没有真正修复它。

这就是字符串连接应该做的:它连接匹配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');

有人有想法或可能的解决方案吗?提前谢谢!