将sql查询结果导出到oracle中的xml数据文件

时间:2017-01-23 05:50:20

标签: sql xml oracle

我有一个SQL查询,它返回两列包含如下数据:。

State   Name  
------- ---------
Online  Terminal1
Offline Terminal2
Online  Terminal3
Online  Terminal4

现在我想创建一个运行SQL查询的XML文件。 XML文件结构必须如下:

<?xml version="1.0" encoding="utf-8" ?>
<Terminallist name="xml data">
   <Value id="0">
      <Terminal>Terminal1</Terminal>
      <State>Online</State>
   </Value>
   <Value id="1">
      <Terminal>Terminal2</Terminal>
      <State>Offline</State>
   </Value>
   <Value id="2">
      <Terminal>Terminal3</Terminal>
      <State>Online</State>
   </Value>
   <Value id="3">
      <Terminal>Terminal4</Terminal>
      <State>Online</State>
   </Value>
</Terminallist>

我想将XML文件保存到像c:/file.xml这样的目录。

2 个答案:

答案 0 :(得分:2)

答案: -

表名:temptable

表格中的数据:

enter image description here

查询: -

<StackLayout Orientation="Horizontal" x:Name="lblStack"/>

输出: -

    SELECT XMLElement("Terminallist ", XMLAttributes('xml data' AS "name"),XMLAgg(XMLElement("value ", XMLAttributes(rownum AS "id"),XMLForest(Terminal,state))))
FROM temptable ;

由于 Narendar

答案 1 :(得分:0)

此解决方案使用WITH子句根据需要生成ID,从0开始。使用分析row_number()函数在结果集中提供有保证的排序顺序。

注意:XMLRoot()已弃用,作为XML / SQL标准的一部分,但会生成您要求的版本标头。 Find out more

with cte as (
    select row_number() over (order by name) - 1 as id
           , name
           , state
    from terminals
    )
SELECT xmlroot (
  XMLElement(
    "Terminallist",
    XMLAttributes( 'xml data' as  "name"),
       XMLAgg(XMLElement("Value",
                         XMLAttributes(cte.id as "id"),
                         XMLElement("Terminal",cte.name),
                         XMLElement("State",cte.state)
                         )
      )
      )
    , version '1.0'   )
FROM cte
order by cte.id
/

这是输出:

<?xml version="1.0"?>
<Terminallist name="xml data">
  <Value id="0">
    <Terminal>Terminal1</Terminal>
    <State>Online</State>
  </Value>
  <Value id="1">
    <Terminal>Terminal2</Terminal>
    <State>Offline</State>
  </Value>
  <Value id="2">
    <Terminal>Terminal3</Terminal>
    <State>Online</State>
  </Value>
  <Value id="3">
    <Terminal>Terminal4</Terminal>
    <State>Online</State>
  </Value>
</Terminallist>

至于将输出写入文件,这取决于您希望如何调用SQL。如果您从SQL * Plus运行它并想要将其保存到本地文件,请使用SPOOL。如果从PL / SQL运行,您需要使用UTL_FILE并写入数据库服务器上的目录。