【问题标题】:Export sql query results to xml data file in oracleoracle中将sql查询结果导出到xml数据文件
【发布时间】:2017-01-23 18:07:42
【问题描述】:

我有一个 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 这样的目录中。

【问题讨论】:

  • 为此您可以编写自己的软件程序来执行SQL查询并根据需要保存结果,或者您可以下载一些可以为您执行此操作的软件。
  • 使用 xmlgen 包生成所需格式的 xml 字符串,并使用 utl 文件包将该字符串写入文件

标签: sql xml oracle


【解决方案1】:

答案:-

表名:temptable

表格中的数据:

查询:-

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

输出:-

<Terminallist name = "xml data">
  <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>

谢谢 纳伦达

【讨论】:

    【解决方案2】:

    此解决方案使用 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 并写入数据库服务器上的目录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-26
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多