在Oracle表中加载带有fn:string连接的XML后拆分查询结果
我已经将一些XML文件加载到Linux x64上的Oracle数据库11gr2中,并且我必须使用fn:string连接来成功导入包含多个记录的XML文件 在使用SQL*LOADER将数据导入到XMLTYPE表之后,我发出了一个查询,将XML数据从XMLTYPE表传输到一个常规表,我们将该表称为 此表现在包含导入的记录的所有字段。在本例中,目标字段中包含两条记录,例如 xml文件包含计算机品牌的条目,第一条记录的值为“Dell”,第二条记录的值为“Apple”。 现在,XML文件中的两条记录已被选择/插入到表A中,但位于同一字段中,用分号分隔。 字段名称:计算机品牌 价值观:戴尔;苹果 我想做的是从表中选择单独的值,而不考虑字段中不同值的数量,因为此查询需要从计划作业运行,并传递它们以将所有值插入各自的单独字段中 下面是我制作/使用过的东西的一个例子: 表A元数据:在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文件中的两条记录已被选
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');
有人有想法或可能的解决方案吗?提前谢谢!