1

SQL select ステートメントとして、行に格納された一連の xml ドキュメントからデータセットを抽出するにはどうすればよいですか? 質問を説明するサンプル タスクを次に示します。

入力

create table circle
  ( id       number         not null primary key
  , name_xml varchar2(2000) 
  )
/

insert into circle
 select 1, '<t><person><firstn>Sean       </firstn> <lastn>Durkin     </lastn></person>' ||
              '<person><firstn>Tom        </firstn> <lastn>Sawyr      </lastn></person></t>' from dual union all
 select 2, '<t><person><firstn>Philip     </firstn> <lastn>Marlowe    </lastn></person>' ||
              '<person><firstn>John       </firstn> <lastn>Wayne      </lastn></person>' ||
              '<person><firstn>Constantine</firstn> <lastn>Palaeologus</lastn></person></t>' from dual union all
 select 3, null from dual;

したがって、テーブル サークルでは、3 つのテーブル行に 5 人が分散しています。firstn各個人は、名 ( ) と姓 ( )で識別されlastnます。

入力構造

name_xml列が空であるか、ルート要素を持つ XML ドキュメントです<t>。下<t>は任意の数です<person>。そして下<person>は両方<firstn><lastn>その順序です。リストに示されているスペースは読みやすくするためのものであり、実際のデータではありません。

期待される出力

フルネームのリストを取得したい。単一の文字列列である必要があります。上記のデータから、出力が期待されます...

People
----------------------- 
Sean Durkin
Tom Sawyr
Philip Marlowe
John Wayne
Constantine Palaeologus

環境

私のデータベース エンジンはOracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi.

これまでに試したこと

私が読んで理解したことから、このクエリは機能するはずです...

select extract( name_parts, '/person/firstn') || ' ' || 
       extract( name_parts, '/person/firstl') as People
 from (
 select
  extract( XMLType( name_xml), '/t/person').getStringVal() as name_parts
  from circle
  where name_xml is not null)

しかし、これはエラーを返しますinconsistent data type

4

1 に答える 1