XML シリアライゼーション

XML シリアライゼーションとは、XML データを、XQuery および XPath データ・モデル内の表現 ( Db2® データベース内にある階層形式) から、アプリケーション内にあるシリアライズされたストリング形式に変換するプロセスのことです。

Db2 データベース・マネージャーを使用して暗黙的にシリアライゼーションを行うことも、XMLSERIALIZE 関数を呼び出して XML シリアライゼーションを明示的に要求することもできます。 XML シリアライゼーションが最も一般的に使用されるのは、XML データがデータベース・サーバーからクライアントに送られるときです。

暗黙的な直列化の方がコーディングが容易であり、XML データをクライアントに送信すると、DB2 クライアント側で XML データを適切に処理できるため、暗黙的な直列化はほとんどの場合に好ましい方法となります。 明示的なシリアライゼーションでは追加の処理が必要となります。 この処理は、暗黙的なシリアライゼーションではクライアントによって自動的に処理されます。

一般には、データを XML データとしてクライアントに送る方が効率が良いので、暗黙的なシリアライゼーションがより好ましい方法です。 ただし、(後ほど説明する) 特定の状況では、明示的な XMLSERIALIZE を行う方が優れています。

XML データの変換先として最適なデータ・タイプは BLOB データ・タイプです。バイナリー・データを検索するとエンコード方式に関する問題が少なくなるためです。

暗黙的な XML シリアライゼーション

暗黙的なシリアライゼーションでは、クライアントが XML データ・タイプをサポートする場合、 データはクライアントに送られるときに XML タイプになります。 CLI および組み込み SQL アプリケーションの場合、 Db2 データベース・サーバーは、適切なエンコード方式を指定した XML 宣言をデータに追加します。 Java™ および .NET アプリケーションの場合、 Db2 データベース・サーバーは XML 宣言を追加しませんが、データを DB2Xml オブジェクトに取り出し、特定のメソッドを使用してそのオブジェクトからデータを取り出す場合、 IBM® Data Server Driver for JDBC and SQLJ は XML 宣言を追加します。

例: C プログラムで、カスタマー ID「1000」の customerinfo 文書を 暗黙的にシリアライズして、シリアライズされた文書を取り出してバイナリー XML ホスト変数に入れます。 取り出されたデータは UTF-8 コード化スキームによるもので、XML 宣言を含んでいます。
EXEC SQL BEGIN DECLARE SECTION;
 SQL TYPE IS XML AS BLOB (1M) xmlCustInfo;
EXEC SQL END DECLARE SECTION;
...
EXEC SQL SELECT INFO INTO :xmlCustInfo
  FROM Customer
  WHERE Cid=1000;

明示的な XML シリアライゼーション

XMLSERIALIZE を明示的に呼び出した後に、データはデータベース・サーバー内で非 XML データ・タイプとなり、 そのデータ・タイプでクライアントに送られます。

XMLSERIALIZE では、以下を指定できます。
  • データがシリアライズされるときの、変換後の SQL データ・タイプ

    データ・タイプは、文字またはバイナリー・データ・タイプです。

  • 出力データに次の明示的なエンコード方式指定が含まれるかどうか (EXCLUDING XMLDECLARATION または INCLUDING XMLDECLARATION)
    <?xml version="1.0" encoding="UTF-8"?>
XMLSERIALIZE からの出力は、Unicode UTF-8 でエンコードされたデータとなります。

シリアライズされたデータを取り出してバイナリーではないデータ・タイプにする場合、 データはアプリケーションのエンコード方式に変換されますが、エンコード方式の指定は変更されません。 そのため、データのエンコード方式はエンコード方式の指定と一致しない可能性が大きくなります。 この場合、エンコード方式の名前に依存しているアプリケーション・プロセスで XML データを構文解析できなくなります。

一般には、データを XML データとしてクライアントに送る方が効率が良いので、暗黙的なシリアライゼーションがより好ましい方法です。 ただし、以下の状況では、明示的な XMLSERIALIZE を行う方が優れています。
  • XML 文書が非常に大きいとき

    XML ロケーターがないため、XML 文書が非常に大きいときは、XMLSERIALIZE を使用してデータを LOB タイプに変換し、LOB ロケーターを使用できるようにする必要があります。

  • クライアントが XML データをサポートしないとき
    クライアントが XML データ・タイプをサポートしない、以前のバージョンである場合、 暗黙的な XML シリアライゼーションを使用するときは、 Db2 データベース・サーバーは データをクライアントに送る前にそのデータを以下のデータ・タイプの 1 つに変換します。
    • デフォルトで、BLOB データ・タイプ
    • サーバー上で db2set コマンドを使用して DB2_MAP_XML_AS_CLOB_FOR_DLC レジストリー変数を YES に設定した場合、CLOB データ・タイプ
    取り出したデータを別のデータ・タイプにする場合、XMLSERIALIZE を実行できます。
例: サンプル表 Customer 内の XML 列 Info に、以下のデータと階層的に同等のものが入った文書が入っています。
<customerinfo Cid='1000'>
  <name>Kathy Smith</name>
  <addr country='Canada'>
  <street>5 Rosewood</street>
  <city>Toronto</city>
  <prov-state>Ontario</prov-state>
  <pcode-zip>M6W 1E6</pcode-zip>
  </addr>
  <phone type='work'>416-555-1358</phone>
</customerinfo>
データを取り出してホスト変数に入れる前に、XMLSERIALIZE を呼び出してデータをシリアライズし、BLOB タイプに変換します。
SELECT XMLSERIALIZE(Info as BLOB(1M)) from Customer
  WHERE CID=1000