データベースの列からデータを選択して出力メッセージに組み込むために、Compute、Filter、または Database ノードを構成することができます。
以下の例では、USERTABLE というデータベース表を作成し、2 つの char(6) データ・タイプの列 (またはそれに相当するもの) を設け、それぞれ Column1 および Column2 としたと想定します。表には 2 つの行があります。
Column1 | Column2 | |
---|---|---|
行 1 | value1 | value2 |
行 2 | value3 | value4 |
表が定義されたデータベースを識別するには、Compute、Filter、または Database ノードを構成します。 例えば、(ノードの data source プロパティーで指定された) デフォルト・データベースを使用する場合には、ノードを右クリックし、「ESQL のオープン」を選択して、このノードのモジュール内に以下の ESQL ステートメントをコーディングします。
SET OutputRoot = InputRoot; DELETE FIELD OutputRoot.*[<]; SET OutputRoot.XML.Test.Result[] = (SELECT T.Column1, T.Column2 FROM Database.USERTABLE AS T);
次の出力メッセージが生成されます。
<Test> <Result> <Column1>value1</Column1> <Column2>value2</Column2> </Result> <Result> <Column1>value3</Column1> <Column2>value4</Column2> </Result> </Test>
<Test> <Result> <Column1></Column1> <Column2></Column2> </Result> <Result> <Column1></Column1> <Column2></Column2> </Result> </Test>
XML の厳密な構造は重要ではありませんが、 囲むタグは ESQL での参照と対応するように <Test> でなければなりません。 囲むタグが <Test> ではない場合、ESQL ステートメントの結果として、 最上位の囲むタグが形成されることになり、無効な XML になってしまいます。
特定の条件を満たすすべての行のすべての列を組み込んだ出力メッセージを作成する場合は、WHERE 文節を持つ SELECT ステートメントを使用します。
-- 変数を宣言および初期化して -- テスト値を取得する (この場合は Smith という姓) DECLARE CurrentCustomer STRING 'Smith'; -- 表のレコードをループして一致する情報を抽出する。 SET OutputRoot.XML.Invoice[] = (SELECT R FROM Database.USERTABLE AS R WHERE R.Customer.LastName = CurrentCustomer );
メッセージ・フィールドは、列が表に出現するのと同じ順序で作成されます。
データベース環境における SQL に詳しいならば、SELECT * をコーディングすることを検討できます。 宣言された変数との間であいまいさが生じないようにするために列へのすべての参照は相関名で始める必要があるため、この構文はブローカーには受け入れられません。 また、SELECT I.* をコーディングする場合、この構文はブローカーには受け入れられますが、* は最初の子エレメントとして解釈され、 他のデータベース SQL に期待するようにすべてのエレメントとしては解釈されません。
データベースの結果セットをパーサー所有メッセージ・ツリーに割り当てるには、結果セットがメッセージ定義と正確に一致している必要があります。 汎用 XML パーサーは自己定義型なので、この例では Invoice フォルダー外に新しいサブツリーが作成され、パーサーはサブツリー内の新しいエレメントを構文解析できます。 結果セットの構造がメッセージ定義と正確に一致する場合は、その結果セットを直接 OutputRoot メッセージ本体ツリーに割り当てることができます。
結果セットの構造が MRM メッセージ定義と正確に一致しない場合は、最初に結果セットを ROW データ・タイプか、パーサーに関連付けられていない Environment ツリーに割り当てなければなりません。
その後、必要なデータを OutputRoot に割り当て、メッセージ定義に準拠するメッセージ・ツリーを構築できます。
データベース・システムに大/小文字の区別がある場合には、別のアプローチを使う必要があります。 生成されるフィールドの名前を別のものに変更したい場合にも、そのアプローチが必要とされます。
SET OutputRoot = InputRoot; SET OutputRoot.XML.Test.Result[] = (SELECT T.Column1 AS Column1, T.Column2 AS Column2 FROM Database.USERTABLE AS T);
この例は、図 1で示されているものと同じ出力メッセージを生成します。データベース列への参照 (この例では、T.Column1 および T.Column2) が、データベース定義と厳密に合致するように、大/小文字が正しく指定されているか確認してください。 データベース定義と厳密に一致しない場合 (例えば T.COLUMN1 を指定した場合)、ブローカーは実行時エラーを生成します。 SELECT ステートメントで別の値を使用できるとしても、データベースで定義された値を一致させるために、Column1 および Column2 を 使用します。値は一致していなくても構いません。
データベースのビット・ストリームにメッセージ・フローによる問い合わせや操作が必要なければ、何も変更することなく、BLOB ドメインに出力メッセージを作成できます。
SET Environment.Variables.DBResult = THE( SELECT T.* FROM Database.TABLE1 AS T); DECLARE resultRef REFERENCE TO Environment.Variables.DBResult; IF LASTMOVE(resultRef) THEN DECLARE outMsg BLOB resultRef.MSGDATA ; DECLARE outCCSID INT resultRef.MSGCCSID; DECLARE outEncoding INT resultRef.MSGENCODING; DECLARE outMsgPriority INT resultRef.MSGPRIORITY; DECLARE outMsgSeqNum INT resultRef.MSGSEQNUMBER; SET OutputRoot.Properties.CodedCharSetId = outCCSID; SET OutputRoot.Properties.Encoding = outEncoding ; CREATE LASTCHILD OF OutputRoot DOMAIN('MQMD') PARSE(outMsg, outEncoding, outCCSID); SET OutputRoot.MQMD.StrucId = MQMD_STRUC_ID; SET OutputRoot.MQMD.Version = MQMD_VERSION_2; SET OutputRoot.MQMD.Priority = outMsgPriority; SET OutputRoot.MQMD.MsgSeqNumber = outMsgSeqNum; DECLARE HDRL INT ; SET HDRL = LENGTH(BITSTREAM(OutputRoot.MQMD)); CREATE FIELD OutputRoot."BLOB"."BLOB"; DECLARE MSGB BLOB; SET MSGB = SUBSTRING(outMsg FROM HDRL +1); SET OutputRoot."BLOB"."BLOB" = MSGB; END IF;
データベースから抽出したビット・ストリームに対して問い合わせや操作を行う場合は、オリジナルのメッセージ・ツリーを再作成する必要があります。 ビット・ストリームから XML メッセージ・ツリーを再作成するには、PARSE 文節を使った CREATE ステートメントを使用します。 その後、出力メッセージをメッセージ・フローによって変更できるようになります。
例えば、以下のステートメントを使用してデータベース表を作成することができます。
INSERT INTO Database.TABLE1(MSGDATA, MSGENCODING, MSGCCSID) VALUES (msgBitStream, inEncoding, inCCSID);
次のコード・スニペットは、表から読み取られたデータを使用して XMLNS ドメインでメッセージ・ツリーを再作成する方法を示しています。
CALL CopyMessageHeaders(); SET Environment.Variables.DBResult = THE( SELECT T.* FROM Database.TABLE1 AS T); DECLARE resultRef REFERENCE TO Environment.Variables.DBResult; IF LASTMOVE(resultRef) THEN DECLARE outCCSID INT resultRef.MSGCCSID; DECLARE outEncoding INT resultRef.MSGENCODING; DECLARE outMsg BLOB resultRef.MSGDATA; SET OutputRoot.Properties.CodedCharSetId = outCCSID; SET OutputRoot.Properties.Encoding = outEncoding; CREATE LASTCHILD OF OutputRoot DOMAIN('XMLNS') PARSE(outMsg, outEncoding, outCCSID); -- Now modify the message tree fields SET OutputRoot.XMLNS.A.B = 4; SET OutputRoot.XMLNS.A.E = 5; END IF;
次の例では、CHAR や VARCHAR などの文字データ・タイプを持つデータベース列にデータが保持されています。 データベースから抽出したデータを BLOB 形式に変換するのには、CAST を使用します。 データベースのビット・ストリーム・データにメッセージ・フローによる問い合わせや操作が必要なければ、何も変更することなく、BLOB ドメインに出力メッセージを作成できます。
CALL CopyMessageHeaders(); SET Environment.Variables.DBResult = THE( SELECT T.* FROM Database.TABLE1 AS T); DECLARE resultRef REFERENCE TO Environment.Variables.DBResult; IF LASTMOVE(resultRef) THEN DECLARE outCCSID INT resultRef.MSGCCSID; DECLARE outMsg BLOB CAST(resultRef.MSGDATA AS BLOB CCSID outCCSID); SET OutputRoot.Properties.CodedCharSetId = outCCSID; SET OutputRoot.Properties.Encoding = resultRef.MSGENCODING; SET OutputRoot.BLOB.BLOB = outMsg; END IF;
次の例では、CHAR や VARCHAR などの文字データ・タイプを持つデータベース列にデータが保持されています。 データベースから抽出したデータを BLOB 形式に変換するのには、CAST を使用します。 メッセージ・フロー内でこのデータの問い合わせまたは操作を行う場合は、オリジナルのメッセージ・ツリーを再作成する必要があります。 この例では、PARSE 文節を持つ CREATE ステートメントを使用して、XMLNS ドメインに XML メッセージ・ツリーを再作成します。
CALL CopyMessageHeaders(); SET Environment.Variables.DBResult = THE( SELECT T.* FROM Database.TABLE1 AS T); DECLARE resultRef REFERENCE TO Environment.Variables.DBResult; IF LASTMOVE(resultRef) THEN DECLARE outCCSID INT resultRef.MSGCCSID; DECLARE outEncoding INT resultRef.MSGENCODING; DECLARE outMsg BLOB CAST(resultRef.MSGDATA AS BLOB CCSID outCCSID); SET OutputRoot.Properties.CodedCharSetId = outCCSID; SET OutputRoot.Properties.Encoding = outEncoding; CREATE LASTCHILD OF OutputRoot DOMAIN('XMLNS') PARSE(outMsg, outEncoding, outCCSID); -- Now modify the message tree fields SET OutputRoot.XMLNS.A.B = 4; SET OutputRoot.XMLNS.A.E = 5; END IF;