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
。