2017-01-23 66 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,它完美的工作! –

相關問題