如何将XML属性作为列写入Oracle中的表?

时间:2013-08-22 18:55:40

标签: xml oracle parsing plsql

我试图通过互联网找到解决方案。我看过的一些东西: https://forums.oracle.com/thread/2182669 http://www.club-oracle.com/forums/how-to-insert-data-from-xml-to-table-t2845/

在所有这些情况下,解决方案都考虑XML结构,只包含节点和子节点,但不考虑属性。事实上,其中一个解决方案建议将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;

1 个答案:

答案 0 :(得分:3)

也许您可以将INSERT-SELECT与xmltable一起使用 例如,您可以使用以下查询从xml中选择数据:

Here is a sqlfiddle demo

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