0

タイトルは少し誤解を招く可能性があるので、問題を説明しようと思います。

SELECTステートメントを使用してデータベースから選択したデータを使用してXMLを構築する必要があります。問題は、これがかなり大きなxmlであると想定されていることです。この構造は、別のテーブルにすでに格納されているxmlと一致している必要があります。次のようなことをする方法はありますか?

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

xmlelementなどを使用してxml全体を構築することは避けたいです...私の説明が少し混沌としている可能性があることを認識しているので、何かが明確でない場合は、質問に答えようとします。

助けてくれてありがとう。

4

1 に答える 1

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行ごとに異なるフィールドに入力するだけです。

于 2013-03-25T13:10:30.080 に答える