É possível configurar um nó Compute, Filter ou Banco de Dados para selecionar dados das colunas do banco de dados e incluí-lo em uma mensagem de saída.
O exemplo a seguir assume que você possui uma tabela do banco de dados chamada USERTABLE com duas colunas de tipos de dados char(6) (ou equivalente), chamadas Column1 e Column2. A tabela contém duas linhas:
Column1 | Column2 | |
---|---|---|
Row 1 | value1 | value2 |
Row 2 | value3 | value4 |
Configure o nó Compute, Filter ou Banco de Dados para identificar o banco de dados no qual a tabela foi definida. Por exemplo, se você estiver utilizando o banco de dados padrão (especificado na propriedade data source do nó), clique com o botão direito do mouse no nó, selecione Abrir ESQL (Open ESQL) e codifique as seguintes instruções ESQL no módulo para esse nó:
SET OutputRoot = InputRoot;
DELETE FIELD OutputRoot.*[<];
SET OutputRoot.XML.Test.Result[] =
(SELECT T.Column1, T.Column2 FROM Database.USERTABLE AS T);
Esse código ESQL produz a seguinte mensagem de saída:
<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>
A estrutura exata do XML não é importante, mas a tag de inclusão deve ser <Teste> para corresponder à referência no ESQL. Se a tag de inclusão não for <Test>, as instruções ESQL resultarão na formação de tags de inclusão de nível superior, que não é XML válido.
Se desejar criar uma mensagem de saída que inclua todas as colunas de todas as linhas que atendem uma determinada condição, utilize a instrução SELECT com uma cláusula WHERE:
-- 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
);
Os campos da mensagem são criados na mesma ordem que as colunas ocorrem na tabela.
Se estiver familiarizado com SQL em um ambiente do banco de dados, talvez você espere codificar SELECT *. Esta sintaxe não é aceita pelo broker, porque é necessário iniciar todas as referências às colunas com um nome de correlação, para evitar ambigüidades com as variáveis declaradas. Além disso, se você codificar SELECT I.*, esta sinaxe será aceita pelo broker, mas o * será interpretado como o primeiro elemento filho e não todos os elementos, conforme você deve esperar de outro SQL de banco de dados.
A designação do conjunto de resultados de um banco de dados a uma árvore de mensagens pertencente ao analisador requer que o conjunto de resultados corresponda exatamente à definição de mensagem. Como o analisador XML genérico é de autodefinição, o exemplo cria uma nova subárvore fora da pasta Fatura e o analisador pode analisar os novos elementos na subárvore. Se a estrutura do conjunto de resultados corresponder exatamente à definição de mensagem, o conjunto de resultados poderá ser designado diretamente à árvore do corpo da mensagem OutputRoot.
Se a estrutura do conjunto de resultados não corresponder exatamente à definição de mensagem MRM, será necessário designar primeiro o conjunto de resultados a um tipo de dados ROW ou a uma árvore Ambiente que não tenha um analisador associado a ela.
Os dados necessários podem ser designados a OutputRoot para construir uma árvore de mensagens em conformidade com a definição de mensagem.
Se o sistema de banco de dados fizer distinção entre maiúsculas e minúsculas, é necessário utilizar uma abordagem alternativa. Essa abordagem também é necessária para alterar o nome do campo gerado para algo diferente:
SET OutputRoot = InputRoot;
SET OutputRoot.XML.Test.Result[] =
(SELECT T.Column1 AS Column1, T.Column2 AS Column2
FROM Database.USERTABLE AS T);
Esse exemplo produz a mesma mensagem de saída que aquela mostrada em Figura 1. Verifique se as referências às colunas do banco de dados (neste exemplo, T.Column1 e T.Column2) são especificadas no tipo de letra correto para corresponder exatamente às definições do banco de dados. Se você não corresponder exatamente as definições de banco de dados (por exemplo, se especificar T.COLUMN1), o intermediário gerará um erro de tempo de execução. Column1 e Column2 são utilizadas na instrução SELECT para corresponder às colunas definidas no banco de dados, embora seja possível utilizar qualquer valor aqui; os valores não precisam ser correspondentes.
Se o fluxo de bits do banco de dados não precisar ser interrogado ou manipulado pelo fluxo de mensagens, a mensagem de saída poderá ser construída no domínio BLOB, sem nenhuma alteração.
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;
Se desejar interrogar ou manipular um fluxo de bits extraído de um banco de dados, será necessário recriar a árvore de mensagens original. Para recriar a árvore de mensagens XML a partir do fluxo de bits, é possível utilizar uma instrução CREATE com uma cláusula PARSE. A mensagem de saída pode ser, então, modificada pelo fluxo de mensagens.
Por exemplo, é possível criar uma tabela de banco de dados utilizando a seguinte instrução:
INSERT INTO Database.TABLE1(MSGDATA, MSGENCODING, MSGCCSID)
VALUES (msgBitStream, inEncoding, inCCSID);
O trecho de código a seguir mostra como recriar a árvore de mensagens no domínio XMLNS utilizando os dados lidos na tabela:
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;
No exemplo a seguir, os dados são mantidos em uma coluna do banco de dados com um tipo de dados de caractere, como CHAR ou VARCHAR. Uma conversão é utilizada para converter os dados extraídos do banco de dados para o formato BLOB. Se os dados do fluxo de bits do banco de dados não precisarem ser interrogados ou manipulados pelo fluxo de mensagens, a mensagem de saída poderá ser construída no domínio BLOB, sem nenhuma alteração.
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;
No exemplo a seguir, os dados são mantidos em uma coluna do banco de dados com um tipo de dados de caractere, como CHAR ou VARCHAR. Uma conversão é utilizada para converter os dados extraídos do banco de dados para o formato BLOB. Para manipular ou interrogar estes dados no fluxo de mensagens, é necessário recriar a árvore de mensagens original. Neste exemplo, uma instrução CREATE com uma cláusula PARSE é utilizada para recriar a árvore de mensagens XML no domínio 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 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;