データベースの列からデータを選択して出力メッセージに組み込むために、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> でなければなりません。 そうでない場合、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 に期待するようにすべてのエレメントとしては解釈されません。
データベース・システムに大/小文字の区別がある場合には、別のアプローチを使う必要があります。 生成されるフィールドの名前を別のものに変更したい場合にも、そのアプローチが必要とされます。
SET OutputRoot = InputRoot; SET OutputRoot.XML.Test.Result[] = (SELECT T.Column1 AS Column1, T.Column2 AS Column2 FROM Database.USERTABLE AS T);
この例は前述の例と同じメッセージを生成します。 データベース列への参照 (この例では、T.Column1 および T.Column2) が、データベース定義と厳密に合致するように、大/小文字が正しく指定されているか確認してください。 そうしない場合、たとえば、T.COLUMN1 を指定した場合、ブローカーは実行時エラーを生成します。 SELECT ステートメントでの Column1 および Column2 の使用は注意してください。 どのような値も使用でき、この例とは異なり、データベースで定義した列の名前と一致している必要はありません。