【问题标题】:Building xml with structure from database使用数据库中的结构构建 xml
【发布时间】:2013-03-25 21:10:30
【问题描述】:

标题可能有点误导,所以我会尝试描述问题。

我需要使用 SELECT 语句从数据库中选择的数据构建 XML。问题是这应该是相当大的 xml,其结构必须与已存储在另一个表中的 xml 一致。 有没有办法做类似的事情:

new_xml := some xml already existing in database
modify new_xml with data from SELECT statement 

我想避免使用 xmlelement 等构建整个 xml... 我知道我的描述可能有点混乱,所以如果有不清楚的地方,我会尝试回答任何问题。

感谢您的帮助。

【问题讨论】:

  • 你的意思是你想从数据库中获取XML格式的数据?
  • 我需要将数据从一个表(数据为数字、varchar 等类型)导出到另一个表(数据为 xml 格式)。有 50 多个字段要导出,并且 XML 文档有很多不变的节点,所以它是一个非常大的文档。我想知道是否有一种方法可以通过使用 XMLelement 创建每个节点来避免构建整个 xml 文档。就像获取现有的 XML 文档(填充了常量字段)并从 SELECT 语句中更改我需要的数据。

标签: xml oracle


【解决方案1】:

如果每一行的结构相同,您可以设置一个模板。例如:

SQL> create table source
  2  (
  3   id number,
  4   cola varchar2(20),
  5   colb number
  6  );

Table created.

SQL>
SQL> insert into source values (1, 'teststr', 23898.234);

1 row created.

SQL> insert into source values (2, '', -9989.00);

1 row created.

SQL> insert into source values (3, 'test again', 0);

1 row created.

SQL> commit;

Commit complete.

SQL>
SQL>
SQL> with xml_template as (select xmltype(
  2  '<root>
  3     <somefield>asdas</somefield>
  4     <somefield2>asdas</somefield2>
  5     <typ>
  6        <col1>.</col1>
  7     </typ>
  8     <col2>.</col2>
  9     <col3>.</col3>
 10  </root>') xml
 11                         from dual)
 12  select updatexml(
 13           xt.xml,
 14           '/root/typ/col1/text()', s.id,
 15           '/root/col2/text()', s.cola,
 16           '/root/col3/text()', s.colb)
 17    from xml_template xt
 18         cross join source s;

UPDATEXML(XT.XML,'/ROOT/TYP/COL1/TEXT()',S.ID,'/ROOT/COL2/TEXT()',S.COLA,'/ROOT/
--------------------------------------------------------------------------------
<root>
  <somefield>asdas</somefield>
  <somefield2>asdas</somefield2>
  <typ>
    <col1>1</col1>
  </typ>
  <col2>teststr</col2>
  <col3>23898.234</col3>
</root>

<root>
  <somefield>asdas</somefield>
  <somefield2>asdas</somefield2>
  <typ>
    <col1>2</col1>
  </typ>
  <col2/>
  <col3>-9989</col3>
</root>

<root>
  <somefield>asdas</somefield>
  <somefield2>asdas</somefield2>
  <typ>
    <col1>3</col1>
  </typ>
  <col2>test again</col2>
  <col3>0</col3>
</root>

所以updatexml 只是填写每行不同的字段。

【讨论】:

    猜你喜欢
    • 2020-09-16
    • 1970-01-01
    • 2021-12-02
    • 2011-02-23
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 2018-04-21
    相关资源
    最近更新 更多