2017-01-23 9 views
0

У меня есть SQL-запрос, который возвращает два столбца с такими данными :.Экспорт результатов запроса sql в файл данных xml в oracle

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

Теперь я хочу создать XML-файл с запросом SQL-запросов. Структура файла 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 file –

+0

Для этого вы можете написать собственную программу, которая выполняет SQL-запрос и сохраняет результаты по вашему желанию, или вы можете скачать некоторые мягкие, которые могут сделать это для вас. –

ответ

0

Это решение использует спецификатор для генерации идентификатора, как вы хотите, начиная с 0. Используя аналитические row_number() функции обеспечивает гарантированный порядок сортировки в наборе результатов.

NB: 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. Используйте SPOOL, если вы используете его из SQL * Plus и хотите сохранить его в локальном файле. Если вы работаете с 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, он отлично работает! –

Смежные вопросы