2017-01-23 62 views
0

我有一个SQL查询,它返回两列数据,如下所示:将sql查询结果导出到oracle中的xml数据文件中

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目录。

+0

使用xmlgen包生成所需格式的xml字符串并使用utl文件将该字符串写入文件包 –

+0

为此,您可以编写自己的软件程序,执行SQL查询并保存结果,或者您可以下载一些软可以为你做到这一点。 –

回答

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并写入数据库服务器上的目录。

+0

谢谢!最棒的! –

2

答: -

表名:不是Temptable

数据表:

enter image description here

查询: -

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> 

感谢 Narendar

+0

谢谢Narendar,它完美的工作! –

相关问题