2013-03-25 3 views
0

라는 제목으로 잘못 입력했을 수 있습니다. 문제를 설명하려고합니다.데이터베이스의 구조가있는 xml을

SELECT 문을 사용하여 데이터베이스에서 선택한 데이터로 XML을 작성해야합니다. 문제는 이것이 이미 다른 테이블에 저장된 xml과 일관성이 있어야하는 꽤 큰 xml 구조라고 가정합니다. 같은 것을 할 수있는 방법이 있나요 : 나는 XMLELEMENT 등으로 전체 XML을 구축하지 않도록하고 싶습니다

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

이 ... 뭔가가 그래서 만약 내가, 나의 설명 어쩌면 조금 혼란 알고 있어요 분명하지 않은데 나는 어떤 질문에 대답하려고 노력할 것이다.

도움 주셔서 감사합니다.

+0

u는 XML 형식의 데이터 형식으로 데이터베이스에서 데이터를 가져 오시겠습니까? –

+0

하나의 테이블 (데이터는 숫자, varchar 등의 형식)에서 다른 테이블 (데이터는 xml 형식)으로 데이터를 내보내야합니다. 50 개 이상의 필드가 있으며 XML 문서에는 많은 노드가 있으므로 상수 일뿐입니다. XMLelement를 사용하여 각 노드를 생성하여 전체 XML 문서를 작성하지 않는 방법이 있는지 궁금합니다. 기존 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은 행마다 다른 필드를 채울뿐입니다.

관련 문제