2013-03-25 2 views
0

название может немного ввести в заблуждение, поэтому я попытаюсь описать проблему.Здание xml со структурой из базы данных

Мне нужно построить XML с данными, выбранными из базы данных с помощью оператора SELECT. Проблема в том, что предполагается, что это довольно большой xml, структура которого должна соответствовать xml, уже сохраненной в другой таблице. Есть ли способ сделать что-то вроде:

new_xml := some xml already existing in database 
modify new_xml with data from SELECT statement 

Я хотел бы, чтобы не строить весь XML с XmlElement и т.д ... Я понимаю, что мое описание может быть немного хаотично, так что если что-то непонятно, я постараюсь ответить на любые вопросы.

Благодарим за помощь.

+0

u означает, что вы хотите получать данные из базы данных в формате XML? –

+0

Мне нужно экспортировать данные из одной таблицы (где данные в число, тип varchar и т. Д.) В другую таблицу (где данные находятся в формате xml). Существует более 50 полей для экспорта, а в XML-документе много узлов, которые являются постоянными, поэтому это довольно большой документ. Мне интересно, есть ли способ избежать создания всего XML-документа, создав каждый узел с помощью XMLelement. Подобно принятию существующего документа XML (с заполненными постоянными полями) и просто изменению данных, которые мне нужны из инструкции SELECT. – Jandrejc

ответ

1

вы можете установить шаблон, если структура одинакова для каждой строки. например:

SQL> create table source 
    2 (
    3 id number, 
    4 cola varchar2(20), 
    5 colb number 
    6 ); 

Table created. 

SQL> 
SQL> insert into source values (1, 'teststr', 23898.234); 

1 row created. 

SQL> insert into source values (2, '', -9989.00); 

1 row created. 

SQL> insert into source values (3, 'test again', 0); 

1 row created. 

SQL> commit; 

Commit complete. 

SQL> 
SQL> 
SQL> with xml_template as (select xmltype(
    2 '<root> 
    3  <somefield>asdas</somefield> 
    4  <somefield2>asdas</somefield2> 
    5  <typ> 
    6  <col1>.</col1> 
    7  </typ> 
    8  <col2>.</col2> 
    9  <col3>.</col3> 
10 </root>') xml 
11       from dual) 
12 select updatexml(
13   xt.xml, 
14   '/root/typ/col1/text()', s.id, 
15   '/root/col2/text()', s.cola, 
16   '/root/col3/text()', s.colb) 
17 from xml_template xt 
18   cross join source s; 

UPDATEXML(XT.XML,'/ROOT/TYP/COL1/TEXT()',S.ID,'/ROOT/COL2/TEXT()',S.COLA,'/ROOT/ 
-------------------------------------------------------------------------------- 
<root> 
    <somefield>asdas</somefield> 
    <somefield2>asdas</somefield2> 
    <typ> 
    <col1>1</col1> 
    </typ> 
    <col2>teststr</col2> 
    <col3>23898.234</col3> 
</root> 

<root> 
    <somefield>asdas</somefield> 
    <somefield2>asdas</somefield2> 
    <typ> 
    <col1>2</col1> 
    </typ> 
    <col2/> 
    <col3>-9989</col3> 
</root> 

<root> 
    <somefield>asdas</somefield> 
    <somefield2>asdas</somefield2> 
    <typ> 
    <col1>3</col1> 
    </typ> 
    <col2>test again</col2> 
    <col3>0</col3> 
</root> 

так что updatexml просто заполняет поля, которые изменяются в каждом ряду.

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