PL/SQLでXMLを解析する方法:OracleでのXMLデータ処理ガイド
はじめに
この記事では、Oracle® PL/SQLでXMLデータを扱うためのいくつかの方法について解説します。
XMLファイルのデータをOracle PL/SQLの行と列に変換したい場合、以下の2つのアプローチが利用できます。
- XMLファイルをXML表にロードしてから解析する
- XML表にロードせず、XMLファイルを直接解析する
XMLデータをOracleの表にロードするには、SQLLOADER、utl_file、XML CLOBなどのオプションを使用します。データを表にロードした後は、各XMLタグから値を抽出する必要があります。XMLデータの抽出には、XMLELEMENT、XMLAGG、XMLTABLE、XMLSEQUENCE、EXTRACTVALUEなど、Oracleが提供する組み込み関数を活用できます。
中でも主に使用される組み込み関数がEXTRACTです。以下の画像をご覧ください。
画像出典: https://docs.oracle.com/cd/B19306_01/server.102/b14200/img/extract_xml.gif
サンプルファイル
これらの方法を詳しく確認するために、この記事ではTest.xmlというファイルを使用します。データベース内でファイルにアクセスするには、Oracleで定義されているディレクトリオブジェクトが必要です。ここでは、参照ディレクトリとしてXX_UTL_DIRを使用しますが、ご自身の環境に合わせて任意のディレクトリに置き換えても問題ありません。
Test.xmlの内容は以下の通りです。
<?xml version = '1.0' encoding = 'UTF-8'?>
<UANotification xmlns="https://www.test.com/UANotification">
<NotificationHeader>
<Property name="ErrorMessage" value="User Data Invalid"/>
<Property name="SPSDocumentKey" value="11111111111"/>
<Property name="AppKey" value="22222222"/>
<Property name="FileName" value="SH201701181418.61W"/>
<Property name="SenderName" value="Test"/>
<Property name="ReceiverName" value="Integrated Supply Network"/>
<Property name="DocumentType" value="856"/>
<Property name="SourceDataType" value="XML"/>
<Property name="DestinationDataType" value="FEDS"/>
<Property name="XtencilNet" value="shFedsWrite"/>
<Property name="PreviousMaps" value="shFedsWrite]"/>
</NotificationHeader>
<FINotification xmlns="https://www.test.com/fileIntegration">
<ServiceResult>
<DataError>
<Message>Invalid data test 1</Message>
</DataError>
<DataError>
<Message>Invalid data test 2</Message>
</DataError>
</ServiceResult>
</FINotification>
</UANotification>
方法1:XMLファイルをXML表にロードしてから解析する
まず、データ型XMLTYPEの列を含む表をOracleに作成します。
例えば、以下のコードで表を作成できます。
CREATE TABLE xml_tab (
File_name varchar2(100),
xml_data XMLTYPE
);
次に、以下のコマンドを使用して、Test.xmlのデータをxml_tabに挿入します。
INSERT INTO xml_tab
VALUES ('Test.xml',
XMLTYPE (BFILENAME ('XX_UTL_DIR', 'Test.xml'),
NLS_CHARSET_ID ('AL32UTF8')
));
上記のINSERT文により、ファイルTest.xmlの内容が表xml_tabのxml_dataフィールドに格納されます。INSERTが完了すると、XMLデータが表xml_tab上で利用可能になります。SELECTクエリでデータを読み取るには、続いて紹介するSELECT文を使用します。
親タグDataErrorの下にあるタグMessageのテキストを読み取るには、以下のSQLコマンドを実行します。
SELECT EXTRACT (VALUE (a1),
'/DataError/Message/text()',
'xmlns="https://www.test.com/fileIntegration')
msg
FROM xml_tab,
TABLE (
XMLSEQUENCE (
EXTRACT (
xml_data,
'/UANotification/ns2:FINotification/ns2:ServiceResult/ns2:DataError',
'xmlns="https://www.test.com/UANotification" xmlns:ns2="https://www.test.com/fileIntegration"'))) a1
WHERE file_name = 'Test.xml';
property nameとその値を読み取るには、以下のSQLコマンドを使用します。
SELECT EXTRACTVALUE (VALUE (a1),
'/Property/@name',
'xmlns="https://www.test.com/UANotification')
attribute,
EXTRACTVALUE (VALUE (a1),
'/Property/@value',
'xmlns="https://www.test.com/UANotification')
VALUE
FROM xml_tab,
TABLE (
XMLSEQUENCE (
EXTRACT (
xml_data,
'/UANotification/NotificationHeader/Property',
'xmlns="https://www.test.com/UANotification" xmlns:ns2="https://www.test.com/fileIntegration"'))) a1
WHERE file_name = 'Test.xml';
方法2:XML表にロードせずにXMLファイルを直接解析する
Test.xmlをOracleの表にロードせずに直接解析したい場合は、以下のSELECT文を使用できます。
SELECT EXTRACTvalue (VALUE (a1),
'/Property/@name',
'xmlns="https://www.test.com/UANotification') attribute,
EXTRACTvalue (VALUE (a1),
'/Property/@value',
'xmlns="https://www.test.com/UANotification') value
FROM
TABLE (
XMLSEQUENCE (
EXTRACT (
xmltype(BFILENAME ('XX_UTL_DIR', 'Test.xml'),NLS_CHARSET_ID ('AL32UTF8')),
'/UANotification/NotificationHeader/Property',
'xmlns="https://www.test.com/UANotification" xmlns:ns2="https://www.test.com/fileIntegration"'))) a1
まとめ
この記事で紹介した2つのXMLデータ解析方法は、どちらも同じ最終結果をもたらします。それぞれの特徴は以下の通りです。
方法1は3段階のプロセスで、以下の手順が必要です。
- Oracle表を作成する
- 作成した表にXMLファイルのデータを挿入する
- 表から値を抽出するSELECT文を作成する
方法2は1段階のプロセスで、SELECT文を書くだけで目的の結果が得られます。
結論
どちらの方法でも目的を達成できますが、将来の参照用にXMLファイルをOracleに保存しておきたい場合は、方法1を選ぶべきです。データが表に永続化されるため、必要なときにいつでもアクセスできます。
一方、方法2を選択すれば、データを直接解析できます。ただし、この方法ではXMLファイルの内容がOracleに保存されないため、元のXMLファイルのデータには後からアクセスできません。用途に応じて最適な方法を選択してください。
コメントやご質問がある場合は、フィードバックタブからお気軽にお寄せください。
専門家による管理・運用・構成で環境を最適化
Rackspaceのアプリケーションサービス(RAS)の専門家は、幅広いアプリケーションポートフォリオにわたって、以下のようなプロフェッショナルサービスおよびマネージドサービスを提供しています。
- eコマースおよびデジタルエクスペリエンスプラットフォーム
- エンタープライズリソースプランニング(ERP)
- ビジネスインテリジェンス
- Salesforceカスタマーリレーションシップマネジメント(CRM)
- データベース
- メールホスティングおよび生産性向上ソリューション
私たちがお約束すること:
- 偏りのない専門知識:即座に価値を発揮する機能に焦点を当て、お客様のモダナイゼーションの道のりをシンプルにし、伴走してサポートします。
- Fanatical Experience™:「プロセスファースト、テクノロジーセカンド®」のアプローチと専任の技術サポートを組み合わせ、包括的なソリューションを提供します。
- 比類のないポートフォリオ:豊富なクラウド経験を活かし、適切なクラウド上に最適なテクノロジーを選択・導入できるよう支援します。
- アジャイルなデリバリー:お客様の現在の状況に合わせて柔軟に対応し、私たちの成功をお客様の成功と共に実現します。
今すぐチャットでご相談ください。
-
Oracle Database 19cのSQL検疫(SQL Quarantine)機能とは?リソースマネージャによる暴走クエリ対策の完全ガイド
本記事では、Oracle Database 19cの新機能であるSQL検疫(SQL Quarantine)について詳しく解説します。Oracle® Resource Managerを使用すると、CPUやI/Oといったシステムリソースの使用量を制御・制限できます。さらに注目すべきは、定義された閾値を超える長時間実行クエリの実行自体を防止できる点です。 SQL検疫(SQL Quarantine)とは何か? 「検疫(Quarantine)」とは隔離を意味します。SQL検疫は、暴走クエリ(Runaway Query)がもたらすオーバーヘッドを排除するために使用できる、19cの新機能です。暴走クエリとは
-
ElasticsearchでSQLデータベースに検索・可視化機能を追加する方法
NoSQLデータストアが注目を集める昨今ですが、リレーショナルデータベースやSQLベースのデータベースは今なお現役で活躍しています。実際、私たちが関わるほぼすべてのお客様の環境では、MongoDB、Redis、Elasticsearchなどと並んで、MySQL、PostgreSQL、MS SQL Serverが利用されています。リレーショナルデータベースから別のデータストアへデータを複製する最も簡単な方法についてのご相談は少なくありません。システム移行のための場合もあれば、全文検索や可視化といった機能を既存のリレーショナルデータに追加したいというケースもあります。幸い、Elasticsearc