IBM Books

管理およびプログラミングの手引き

XML 文書を合成する

XML エクステンダーには XML 文書を合成するための 2 つのストアード・プロシージャー、 dxxGenXML() および dxxRetrieveXML() が備わっています。

dxxGenXML()
このストアード・プロシージャーは、頻繁に更新されるアプリケーション、 または XML を管理するためのオーバーヘッドを回避したいアプリケーションのために使用されます。 ストアード・プロシージャー dxxGenXML() では、使用可能にされたコレクションは必要ありません。 代わりにそれは DAD ファイルを使用します。

ストアード・プロシージャー dxxGenXML() は、 DAD ファイル内の <Xcollection> 要素によって指定された XML コレクション表に保管されているデータを使用して、 XML 文書を構築します。 このストアード・プロシージャーは、各 XML 文書を 結果表 内に行として挿入します。 また、結果表でカーソルを開いて結果セットを取り出すこともできます。 結果表はアプリケーションによって作成され、 VARCHAR、 CLOB、 XMLVARCHAR、 または XMLCLOB タイプの列が必ず 1 つ必要です。 さらに、DAD ファイル内で妥当性検査要素を YES に指定した場合、 XML エクステンダーは INTEGER タイプの列 DXX_VALID を追加して、 有効な XML 文書には値 1、無効な文書には 0 を挿入します。

さらに、ストアード・プロシージャー dxxGenXML() によって、 結果表に生成する行の最大数を指定できます。 これにより、処理時間が短縮されます。 ストアード・プロシージャーは表にある実際の行数を、 戻りコードおよびメッセージと共に戻します。

分解のための対応するストアード・プロシージャーは dxxShredXML() です。 これはさらに、DAD を入力パラメーターとして取り、 XML コレクションが使用可能になっていることを必要としません。

XML コレクションを合成する: dxxGenXML()

以下のストアード・プロシージャー宣言を使用して、 ストアード・プロシージャー呼び出しをアプリケーションに組み込みます。

dxxGenXML(CLOB(100K)     DAD,             /* input */
               char(UDB_SIZE) resultTabName,   /* input */
               integer        overrideType,    /* input */
               varchar(1024)  override,        /* input */
               integer        maxRows,         /* input */
               integer        numRows,         /* output */
             long           returnCode,       /* output */
             varchar(1024)  returnMsg)        /* output */

完全な構文および例については、dxxGenXML() を参照してください。

例: 以下の例では、XML 文書が合成されます。

#include "dxx.h"
#include "dxxrc.h"
 
EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
     SQL TYPE is CLOB(100K) dad;              /* DAD */
     SQL TYPE is CLOB_FILE  dadFile;          /* dad file */
     char                   result_tab[32];   /* name of the result table */
     char                   override[2];      /* override, will set to NULL*/
     short                  overrideType;     /* defined in dxx.h */
     short                  max_row;          /* maximum number of rows */
     short                  num_row;          /* actual number of rows */
     long                   returnCode;       /* return error code */
     char                   returnMsg[1024];  /* error message text */
     short                  dad_ind;
     short                  rtab_ind;
     short                  ovtype_ind;
     short                  ov_inde;
     short                  maxrow_ind;
     short                  numrow_ind;
     short                  returnCode_ind;
     short                  returnMsg_ind;
 
     EXEC SQL END DECLARE SECTION;
 
     /* create table */
     EXEC CREATE TABLE xml_order_tab (xmlorder XMLVarchar);
     /* read data from a file to a CLOB */
     strcpy(dadfile.name,"c:\dxx\samples\dad\getstart_xcollection.dad");
     dadfile.name_length = strlen("c:\dxx\samples\dad\getstart_xcollection.dad");
     dadfile.file_options = SQL_FILE_READ;
     EXEC SQL VALUES (:dadfile) INTO :dad;
     strcpy(result_tab,"xml_order_tab");
     override[0] = '\0';
     overrideType = NO_OVERRIDE;
     max_row = 500;
     num_row = 0;
     returnCode = 0;
     msg_txt[0] = '\0';
     collection_ind = 0;
     dad_ind = 0;
     rtab_ind = 0;
     ov_ind = -1;
     ovtype_ind = 0;
     maxrow_ind = 0;
     numrow_ind = -1;
     returnCode_ind = -1;
     returnMsg_ind = -1;
     /* Call the store procedure */
     EXEC SQL CALL dxxGenXML(:dad:dad_ind;
          :result_tab:rtab_ind,
          :overrideType:ovtype_ind,:override:ov_ind,
          :max_row:maxrow_ind,:num_row:numrow_ind,
          :returnCode:returnCode_ind,:returnMsg:returnMsg_ind);

DAD ファイルに指定された SQL 照会は 250 の XML 文書を生成するため、 ストアード・プロシージャーが呼び出された後の結果表には 250 行が含まれます。

dxxRetrieveXML()
このストアード・プロシージャーは、 定期的な更新を行うアプリケーションのために使用されます。 同じタスクが繰り返されるので、パフォーマンスの改善が重要になります。 XML コレクションを使用可能にして、 ストアード・プロシージャー内でコレクション名を使用すると、パフォーマンスが改善されます。

ストアード・プロシージャー dxxRetrieveXML() は、 ストアード・プロシージャー dxxGenXML() と同様の働きをしますが、 DAD ファイルの代わりに XML コレクションの名前を取ります。 XML コレクションが使用可能にされると、DAD ファイルは XML_USAGE 表に保管されます。 そのため、XML エクステンダーは DAD ファイルを検索して、 それ以降 dxxRetrieveXML() は dxxGenXML() と同じになります。

dxxRetrieveXML() によって、同じ DAD ファイルを合成と分解の両方に使用できます。 このストアード・プロシージャーはさらに、分解された XML 文書の検索にも使用できます。

分解のための対応するストアード・プロシージャーは dxxInsertXML() です。 これはさらに、使用可能にされた XML コレクションの名前を取ります。

XML コレクションを合成する: dxxRetrieveXML()

以下のストアード・プロシージャー宣言を使用して、 ストアード・プロシージャー呼び出しをアプリケーションに組み込みます。

dxxRetrieveXML(char(UDB_SIZE) collectionName,  /* input */
               char(UDB_SIZE) resultTabName,   /* input */
               integer        overrideType,    /* input */
               varchar(1024)  override,        /* input */
               integer        maxRows,         /* input */
               integer        numRows,         /* output */
             long           returnCode,       /* output */
             varchar(1024)  returnMsg)        /* output */

完全な構文および例については、dxxRetrieveXML() を参照してください。

例: 以下に dxxRetrieveXML() への呼び出しの例を示します。 ここでは、結果表が名前 XML_ORDER_TAB で作成され、 XMLVARCHAR タイプの列が 1 つあると想定しています。

#include "dxx.h"
#include "dxxrc.h"
 
            EXEC SQL INCLUDE SQLCA;
            EXEC SQL BEGIN DECLARE SECTION;
              char    collection[32];   /* dad buffer */
              char    result_tab[32];   /* name of the result table */
              char    override[2];      /* override, will set to NULL*/
              short   overrideType;     /* defined in dxx.h */
              short   max_row;          /* maximum number of rows */
              short   num_row;          /* actual number of rows */
              long    returnCode;       /* return error code */
              char    returnMsg[1024];  /* error message text */
              short   dadbuf_ind;
              short   rtab_ind;
              short   ovtype_ind;
              short   ov_inde;
              short   maxrow_ind;
              short   numrow_ind;
              short   returnCode_ind;
              short   returnMsg_ind;
 
              EXEC SQL END DECLARE SECTION;
 
              /* create table */
              EXEC SQL CREATE TABLE xml_order_tab (xmlorder XMLVarchar);
 
              /* initialize host variable and indicators */
              strcpy(collection,"sales_ord");
              strcpy(result_tab,"xml_order_tab");
              override[0] = '\0';
              overrideType = NO_OVERRIDE;
              max_row = 500;
              num_row = 0;
              returnCode = 0;
              msg_txt[0] = '\0';
              collection_ind = 0;
              rtab_ind = 0;
              ov_ind = -1;
              ovtype_ind = 0;
              maxrow_ind = 0;
              numrow_ind = -1;
              returnCode_ind = -1;
              returnMsg_ind = -1;
              /* Call the store procedure */
              EXEC SQL CALL dxxRetrieve(:collection:collection_ind;
                     :result_tab:rtab_ind,
                     :overrideType:ovtype_ind,:override:ov_ind,
                     :max_row:maxrow_ind,:num_row:numrow_ind,
                     :returnCode:returnCode_ind,:returnMsg:returnMsg_ind);


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]