Selecting data from database columns
You can configure a Compute, Filter, or Database node to select data from database columns and include it in an output message.
About this task
The following example assumes that you have a database table called USERTABLE with two char(6) data type columns (or equivalent), called Column1 and Column2. The table contains two rows:
Column1 | Column2 | |
---|---|---|
Row 1 | value1 | value2 |
Row 2 | value3 | value4 |
Configure the Compute, Filter, or Database node to identify the
database in which you have defined the table. For example, if you
are using the default database (specified on the data source
property
of the node), right-click the node, select Open ESQL,
and code the following ESQL statements in the module for this node:
SET OutputRoot = InputRoot;
DELETE FIELD OutputRoot.*[<];
SET OutputRoot.XML.Test.Result[] =
(SELECT T.Column1, T.Column2 FROM Database.USERTABLE AS T);
This ESQL produces the following output message:
<Test>
<Result>
<Column1></Column1>
<Column2></Column2>
</Result>
<Result>
<Column1></Column1>
<Column2></Column2>
</Result>
</Test>
The exact structure of the XML is not important, but
the enclosing tag must be <Test>
to match the
reference in the ESQL. If the enclosing tag is not <Test>
,
the ESQL statements result in top-level enclosing tags being formed,
which is not valid XML.
If you want to create an output message that includes all the columns of all the rows that meet a particular condition, use the SELECT statement with a WHERE clause:
-- Declare and initialize a variable to hold the
-- test vaue (in this case the surname Smith)
DECLARE CurrentCustomer STRING 'Smith';
-- Loop through table records to extract matching information
SET OutputRoot.XML.Invoice[] =
(SELECT R FROM Database.USERTABLE AS R
WHERE R.Customer.LastName = CurrentCustomer
);
The message fields are created in the same order as the columns occur in the table.
If you are familiar with SQL in a database environment, you might expect to code SELECT *. This syntax is not accepted by the integration node, because you must start all references to columns with a correlation name to avoid ambiguities with declared variables. Also, if you code SELECT I.*, this syntax is accepted by the integration node, but the * is interpreted as the first child element, not all elements, as you might expect from other database SQL.
The assignment of the result set of a database into a parser-owned
message tree requires the result set to exactly match the message
definition. Because the generic XML parser is self-defining, the example
creates a new subtree off the Invoice folder, and the parser can parse
the new elements in the subtree. If the structure of the result set
exactly matches the message definition, the result set can be assigned
directly into the OutputRoot
message body tree.
If the structure of the result set does not exactly match the MRM message definition, you must first assign the result set into a ROW data type, or an Environment tree that does not have a parser associated with it.
The required data can then be assigned to OutputRoot
to
build a message tree that conforms to the message definition.
Selecting data from a table in a case-sensitive database system
About this task
If the database system is case sensitive, you must use an alternative approach. This approach is also necessary if you want to change the name of the generated field to something different:
SET OutputRoot = InputRoot;
SET OutputRoot.XML.Test.Result[] =
(SELECT T.Column1 AS Column1, T.Column2 AS Column2
FROM Database.USERTABLE AS T);
This example produces the output message as shown in Figure 1. Ensure that references to the
database columns (in this example, T.Column1 and T.Column2) are specified
in the correct case to match the database definitions exactly. If
you do not match the database definitions exactly (for example if
you specify T.COLUMN1), the integration node generates a runtime error. Column1
and Column2
are
used in the SELECT statement to match the columns that you have defined
in the database, although you can use any values here; the values
do not have to match.
Selecting bitstream data from a database
About this task
Example
MSGDATA
MSGCCSID
MSGENCODING
If the bit stream from the database does not need to be interrogated or manipulated by the message flow, the output message can be constructed in the BLOB domain without any alteration.
DOMAIN('MQMD')
.
The output message can then be modified by the message flow: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.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;
If you want to interrogate or manipulate
a bit stream extracted from a database, you must re-create the original
message tree. To re-create the XML message tree from the bit stream,
you can use a CREATE
statement with a PARSE
clause.
The output message can then be modified by the message flow.
For example, you might create a database table by using the following statement:
INSERT INTO Database.TABLE1(MSGDATA, MSGENCODING, MSGCCSID)
VALUES (msgBitStream, inEncoding, inCCSID);
The following code snippet shows how to re-create the
message tree in the XMLNS
domain by using the data
read from the table:
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;
In the following example, the data is held in a database column with a character data type, such as CHAR or VARCHAR. A cast is used to convert the data extracted from the database into BLOB format. If the bitstream data from the database does not need to be interrogated or manipulated by the message flow, the output message can be constructed in the BLOB domain, without any alteration.
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;
In the following example, the data is held
in a database column with a character data type, such as CHAR or VARCHAR.
A cast is used to convert the data extracted from the database into
BLOB format. To manipulate or interrogate this data within the message
flow, you must re-create the original message tree. In this example,
a CREATE
statement with a PARSE
clause
is used to re-create the XML message tree in the XMLNS
domain.
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;