XML エクステンダーには XML 文書を合成するための 2 つのストアード・プロシージャー、 dxxGenXML() および dxxRetrieveXML() が備わっています。
ストアード・プロシージャー dxxGenXML() は、 DAD ファイル内の <Xcollection> 要素によって指定された XML コレクション表に保管されているデータを使用して、 XML 文書を構築します。 このストアード・プロシージャーは、各 XML 文書を 結果表 内に行として挿入します。 また、結果表でカーソルを開いて結果セットを取り出すこともできます。 結果表はアプリケーションによって作成され、 VARCHAR、 CLOB、 XMLVARCHAR、 または XMLCLOB タイプの列が必ず 1 つ必要です。 さらに、DAD ファイル内で妥当性検査要素を YES に指定した場合、 XML エクステンダーは INTEGER タイプの列 DXX_VALID を追加して、 有効な XML 文書には値 1、無効な文書には 0 を挿入します。
さらに、ストアード・プロシージャー dxxGenXML() によって、 結果表に生成する行の最大数を指定できます。 これにより、処理時間が短縮されます。 ストアード・プロシージャーは表にある実際の行数を、 戻りコードおよびメッセージと共に戻します。
分解のための対応するストアード・プロシージャーは dxxShredXML() です。 これはさらに、DAD を入力パラメーターとして取り、 XML コレクションが使用可能になっていることを必要としません。
以下のストアード・プロシージャー宣言を使用して、 ストアード・プロシージャー呼び出しをアプリケーションに組み込みます。
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() は、 ストアード・プロシージャー 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);