Selecionando Dados de Colunas do Banco de Dados

É 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);

Isso produz a seguinte mensagem de saída:

Figura 1. Mensagem de Saída
<Test>
    <Result>
          <Column1>value1</Column1>
        <Column2>value2</Column2>
    </Result>
    <Result>
        <Column1>value3</Column1>
        <Column2>value4</Column2>
    </Result>
</Test>
Para disparar a SELECT, envie uma mensagem de disparo com um corpo XML que esteja no seguinte formato:
<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 intermediário, 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 intermediário, 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.

Selecionando Dados de uma Tabela em um Sistema de Banco de Dados que Faz Distinção entre Maiúsculas e Minúsculas

Se o sistema de banco de dados fizer distinção entre maiúsculas e minúsculas, será 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.

Selecionando Dados de Fluxo de Dados de um Banco de Dados

Estas amostras apresentam como recuperar dados de fluxo de bits XML a partir de um banco de dados e incluí-los em uma mensagem de saída. Consulte Instrução INSERT para obter exemplos que mostram como é possível inserir dados do fluxo de bits em um banco de dados.
Início da mudançaNo exemplo a seguir, os dados do fluxo de bits são mantidos em uma coluna do banco de dados com um tipo de dados BLOB. A tabela de banco de dados utilizada no exemplo (TABLE1) é a que foi criada nos exemplos de Instrução INSERT e contém as seguintes colunas:
  • MSGDATA
  • MSGCCSID
  • MSGENCODING
Fim da mudança

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.

Início da mudançaNo exemplo a seguir, os dados da mensagem, juntamente com o cabeçalho MQMD, são mantidos em uma coluna do banco de dados com um tipo de dados BLOB. Para recriar a árvore de mensagens, incluindo o cabeçalho MQMD, a partir do fluxo de bits, você pode utilizar uma instrução CREATE com uma cláusula PARSE e DOMAIN('MQMD'). A mensagem de saída pode então ser modificada pelo fluxo de mensagens:
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;
Fim da mudança

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.

Início da mudançaPor exemplo, é possível criar uma tabela de banco de dados utilizando a seguinte instrução:Fim da mudança

Início da mudança
INSERT INTO Database.TABLE1(MSGDATA, MSGENCODING, MSGCCSID) VALUES (msgBitStream, inEncoding, inCCSID);
Fim da mudança

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;

Avisos | Marcas Registradas | Downloads | Biblioteca | Suporte | Feedback

Copyright IBM Corporation 1999, 2009Copyright IBM Corporation 1999, 2009.
Última atualização : 2009-02-13 16:12:47

ak05810_