データベース
 Computer >> コンピューター >  >> プログラミング >> データベース

PL/SQLでXMLを解析する

このブログでは、Oracle®PL/SQLでXMLデータを処理するためのいくつかの方法について説明します。データベースサービスの詳細をご覧ください。

XMLデータをXMLファイルからOraclePL/ SQLの行と列に変換する場合は、次のオプションを使用できます。

  • XMLファイルをXMLテーブルにロードしてから、解析します。
  • XMLテーブルにロードせずにXMLファイルを直接解析します。

XMLデータをOracleテーブルにロードするには、SQLLOADERなどのオプションを使用します 、utl_file 、またはXML CLOB 。データをテーブルにロードした後、各XMLタグから値を抽出する必要があります。 XMLデータを抽出するには、XMLELEMENTなどのOracleが提供する組み込み関数を使用します。 、XMLAGGXMLTABLEXMLSEQUENCE 、およびEXTRACTVALUE

使用される主な組み込み関数はEXTRACTです。 、これは次の画像に示されています:

PL/SQLでXMLを解析する

画像ソース :https://docs.oracle.com/cd/B19306_01/server.102/b14200/img/extract_xml.gif

サンプルファイル

これらのオプションを詳細に調べるために、この投稿の例では Test.xmlというファイルを使用しています。 。データベース内のファイルにアクセスするには、 DBAを使用します 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>

最初のアプローチ: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_dataフィールドに入力します テーブルのxml_tab 。 INSERTが完了すると、XMLデータはテーブル xml_tabで使用できるようになります。 。 SELECTクエリでデータを読み取るには、次に説明するSELECTステートメントを使用します。

タグのテキストを読むにはMessage 親タグDataErrorで利用できます 、次の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を直接解析する場合 Oracletableにロードせずに、次の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
まとめ

この投稿で説明されているXMLデータを解析する両方の方法で、同じ最終出力が得られます。最初のアプローチは3段階のプロセスであり、次のコードが必要です。

  1. Oracleテーブルを作成します。
  2. XMLファイルのデータを作成したテーブルに挿入します。
  3. テーブルから値を抽出するためのSELECTステートメントを記述します。

2番目のオプションは、SELECTステートメントを記述して、目的の結果を取得するシングルステッププロセスです。

結論

どちらのオプションも機能しますが、XMLファイルをOracleの将来の参照に格納する必要がある場合は、データが将来の参照のためにテーブルに保持され、いつでもアクセスできるため、最初のアプローチを使用する必要があります。

2番目のアプローチを選択すると、データを直接解析できます。ただし、このオプションを使用すると、XMLファイルのコンテンツがOracleに保存されないため、将来的に元のXMLファイルデータにアクセスできなくなります。

[フィードバック]タブを使用して、コメントを書き込んだり、質問したりします。

専門家による管理、管理、構成で環境を最適化する

Rackspaceのアプリケーションサービス(RAS) 専門家は、幅広いアプリケーションポートフォリオにわたって次の専門的かつ管理されたサービスを提供します。

  • eコマースおよびデジタルエクスペリエンスプラットフォーム
  • エンタープライズリソースプランニング(ERP)
  • ビジネスインテリジェンス
  • Salesforceの顧客関係管理(CRM)
  • データベース
  • メールホスティングと生産性

お届けします:

  • 偏りのない専門知識 :私たちは、即時の価値を提供する機能に焦点を当てて、お客様の近代化の旅を簡素化し、導きます。
  • Fanaticalexperience™ :最初にプロセスを組み合わせます。テクノロジーセカンド。包括的なソリューションを提供するための専用のテクニカルサポートを備えたアプローチ。
  • 比類のないポートフォリオ :豊富なクラウドエクスペリエンスを適用して、適切なテクノロジーを適切なクラウドに選択して導入できるようにします。
  • アジャイルデリバリー :私たちはあなたがあなたの旅の途中であなたに会い、あなたの成功と一致します。

今すぐチャットして始めましょう。


  1. SQL検疫

    このブログ投稿では、SQL検疫の概念を紹介しています。 Oracle®ResourceManagerを使用すると、CPUやI/Oなどのリソースの使用を規制および制限できます。最も興味深い事実は、定義されたしきい値を超える長時間実行クエリの実行を防ぐことができるということです。 SQL検疫とは何ですか? 検疫とは隔離を意味します。 SQL検疫は、暴走クエリのオーバーヘッドを排除するために使用できるバージョン19cの機能です。暴走クエリは、リソースまたはランタイムの制限を超え、リソース、CPU、およびIOの多くを使用するため、ResourceManagerによって終了されるクエリです。 この

  2. Elasticsearchを利用した検索と視覚化をSQLデータに追加します

    新しいNoSQLデータストアに焦点を当てた話題にもかかわらず、リレーショナルデータベースとSQLベースのデータベースはまだ健在です。実際、私たちが協力しているほとんどすべての顧客は、MongoDB、Redis、またはElasticsearchと並んで、環境内にMySQL、PostgreSQL、またはMSSQLServerを持っています。移行として、または単に全文検索や視覚化などの機能をリレーショナルデータに追加するために、リレーショナルデータベースから別のデータストアにデータを複製する最も簡単な方法に関するリクエストを受け取ることは珍しくありません。幸い、Elasticsearchを使用すると