我试图通过互联网找到解决方案。我看过的一些东西: https://forums.oracle.com/thread/2182669 http://www.club-oracle.com/forums/how-to-insert-data-from-xml-to-table-t2845/
在所有这些情况下,解决方案都考虑XML结构,只包含节点和子节点,但不考虑属性。事实上,其中一个解决方案建议将XML转换为规范形式,只有节点没有属性。
这是我正在使用的xml结构示例:
<rep type="P" title="P List">
<as>
<a id="3" />
<a id="4" />
</as>
</rep>
我正在使用 oracle客户端11.2和SQL开发人员
我的问题是:如何将XML数据写入一个表,其中属性也作为列值,在节点旁边?
以下对我的临时表有用,最终我会将其规范化为多个表格。
-- Temp table
CREATE TABLE TEMP_Temp1
(rtype varchar(10),
title varchar(200),
aid varchar(10),
description varchar(100),
flag varchar(50),
po char(1));
x是上面xml片段的varchar变量。
INSERT INTO TEMP_Temp1
SELECT *
FROM xmltable( '/rep' passing xmltype (x) columns rtype VARCHAR(10) path '@type' , title VARCHAR(200) path '@title') AS xmlr ,
xmltable( '/rep/a' passing xmltype (x) columns aid VARCHAR(10) path '@id' , description VARCHAR(100) path '@description' , flag VARCHAR(50) path '@flag' , po CHAR(1) path '@po') AS xmla ;
END;
答案 0 :(得分:3)
也许您可以将INSERT-SELECT
与xmltable一起使用
例如,您可以使用以下查询从xml中选择数据:
select X.*
from xmltable(
'for $i in //rep/as/a return <row>
{$i/../../@type}
{$i/../../@title}
{$i/@id}</row>' passing xmltype('<rep type="P" title="P List">
<as>
<a id="3" />
<a id="4" />
</as>
</rep>')
columns
type varchar2(1) path '@type',
title varchar2(10) path '@title',
id number path '@id'
) X