Instrução CREATE

A instrução CREATE cria um novo campo de mensagem.

SINTAXE

Notas:
  1. Não utilize DomainClause e ParseClause com o qualificador FIELD.
  2. Utilize RepeatClauses apenas com os qualificadores PREVIOUSSIBLING e NEXTSIBLING.
  3. Cada subclásula dentro de ParseClause pode ocorrer apenas uma vez.

O novo campo de mensagem é posicionado em um local especificado (CREATE FIELD) ou relativo a um local existente atualmente (CREATE ... OF...). É possível criar novos campos apenas quando a referência do campo de destino apontar para uma mensagem modificável; por exemplo, Environment, InputLocalEnvironment, OutputLocalEnvironment, OutputRoot, ou OutputExceptionList.

Se uma cláusula FIELD for incluída, o campo especificado por Target será navegado para (criando os campos, se necessário) e qualquer cláusula values ou cláusula from será executada. A inclusão de uma cláusula FIELD não cria necessariamente nenhum campo; apenas assegura que os campos especificados existem.

Se forem utilizados índices da matriz na referência de campo de destino, apenas uma instância de um campo específico poderá ser criada. Assim se você gravar uma instrução SET, começando:
 SET OutputRoot.XMLNS.Message.Structure[2].Field = ... 

pelo menos uma instância de Estrutura já deverá existir na mensagem. Ou seja, os únicos campos na árvore que são criados são em um caminho direto da raiz para o campo identificado pela referência de campo.

Se uma cláusula PREVIOUSSIBLING, NEXTSIBLING, FIRSTCHILD ou LASTCHILD for incluída, o campo especificado por Target será navegado para (criando os campos, se neceSsário) exatamente da mesma forma como para a cláusula FIELD. Um novo campo é então criado e anexado na posição especificada (por exemplo, como PREVIOUSSIBLING ou FIRSTCHILD). Uma instrução CREATE com uma destas cláusulas sempre cria um novo campo e coloca-o na posição especificada.

Se você utilizar duas instruções de destino CREATE FIRSTCHILD OF que especifiquem o mesmo destino, a segunda instrução criará um novo campo como o primeiro filho do destino e deslocará o primeiro filho criado anteriormente para a direita na árvore de mensagens (portanto ele deixa de ser o primeiro filho). De forma semelhante, o destino CREATE LASTCHILD OF navega para o campo de destino e inclui um novo campo como seu filho mais à direita, deslocando o último filho anterior para a esquerda.

o destino CREATE PREVIOUSSIBLING OF cria um campo imediatamente à esquerda do campo especificado por destino (portanto, a profundidade da árvore não é alterada); de forma semelhante, o destino CREATE NEXTSIBLING OF cria um campo logo à direita do campo especificado por destino. Ao criar PREVIOUSSIBLING ou NEXTSIBLING, você pode utilizar a palavra-chave REPEAT para copiar o tipo e nome do novo campo a partir do campo atual.

Cláusula AS:

Se presente, a cláusula AS move a variável de referência denominada para apontar o campo recém-criado. Utilize esta cláusula se desejar envolver o novo campo em algum processamento adicional.

Cláusula DOMAIN:

Se presente, a cláusula DOMAIN associa o novo campo a um novo analisador do tipo especificado. Esta cláusula espera um nome de campo raiz (por exemplo, XMLNS ou MQRFH2). Se a cláusula DOMAIN estiver presente, mas o valor fornecido for uma cadeia de caractere de comprimento zero, será criado um novo analisador do mesmo tipo que o analisador que possui o campo especificado por destino. Será emitida uma exceção se o nome de domínio fornecido não for do tipo de dados CHARACTER ou se seu valor for NULL. Não especifique a cláusula DOMAIN com a cláusula FIELD; não há garantias que o novo campo será criado.

Cláusula REPEAT:

Utilize a cláusula REPEAT para copiar o tipo e o nome do novo campo a partir do campo de destino. Como alternativa, o tipo, nome e valor do novo campo podem ser:
  • Copiados de qualquer campo existente (utilizando a cláusula FROM)
  • Especificados explicitamente (utilizando a cláusula VALUES)
  • Definidos pela análise de um fluxo de bits (utilizando a cláusula PARSE)
No caso das cláusulas FROM e PARSE, é possível criar também filhos do novo campo.

Cláusula VALUES:

Para a cláusula VALUES, o tipo, nome e valor (ou qualquer subconjunto deles) podem ser especificados por qualquer expressão que retorne um tipo de dados adequado (INTEGER para tipo, CHARACTER para nome e qualquer tipo escalar para valor). Será emitida uma exceção se o valor fornecido para um tipo ou nome for NULL.

Cláusula NAMES:

A cláusula NAMES utiliza qualquer expressão que retorna um valor não nulo de tipo caractere. O significado depende da presença das cláusulas NAME e NAMESPACE, conforme a seguir:
NAMESPACE NAME Elemento denominado da seguinte forma
Não Não O elemento não possui nome (o sinalizador de nome não é configurado automaticamente).
Não Sim O elemento recebe o nome no espaço de nomes padrão.
Sim Não O elemento recebe o nome vazio no espaço de nomes especificado.
Sim Sim O elemento recebe o nome especificado no espaço de nomes especificado.

O operando IDENTITY utiliza um único elemento de caminho em lugar das cláusulas TYPE e NAME, em que um elemento de caminho contém (no máximo) um tipo, um espaço de nomes, um nome e um índice. Estes elementos especificam o tipo, espaço de nomes, nome e índice do elemento a ser criado e seguem todas as regras descritas no tópico para referências de campo (consulte Visão geral da referência de campo ESQL). Exemplo:

	IDENTITY (XMLNS.attribute)Space1:Name1[42]

Consulte a seção Exemplos para obter informações sobre como utilizar o operando IDENTITY.

Cláusula FROM:

Para a cláusula FROM, o tipo, nome e valor do novo campo são tomados de SourceFieldReference. Quaisquer campos filhos existentes do destino são desanexados (o campo poderia já existir no caso de uma cláusula FIELD) e o novo campo recebe cópias dos filhos, netos e outros descendentes do campo origem.

cláusula PARSE:

Se uma cláusula PARSE estiver presente, será construída uma subárvore sob o campo recém-criado, a partir do fluxo de bits fornecido. O algoritmo para a construção da subárvore varia de analisador para analisador e de acordo com as opções especificadas. Todos os analisadores suportam o modo RootBitStream, no qual o algoritmo de criação da árvore é igual ao utilizado por um nó input.

Alguns analisadores também suportam um segundo modo, FolderBitStream, que gera uma subárvore a partir de um fluxo de bits criado pela função ASBITSTREAM (consulte função ASBITSTREAM) que está utilizando esse modo.

Quando você utilizar a cláusula PARSE, especifique um valor escalar que contenha o fluxo de bits a ser analisado para BitStreamExpression. Se você utilizar uma referência de campo da árvore de mensagens, deverá assegurar que ela contenha um valor escalar que contém o fluxo de bits. Uma pasta do corpo da mensagem existente, como InputRoot.XMLNSC, não contém um fluxo de bits e, portanto, não pode ser utilizada para serializar a pasta XMLNS. Se você transmitir um valor diferente de um escalar que contenha o fluxo de bits para a cláusula PARSE para BitStreamExpression, o fluxo de mensagens produzirá uma mensagem de erro BIP2906. Em vez disso, você deve primeiro chamar a função ASBITSTREAM para serializar a pasta da árvore de mensagens existente. O resultado da função ASBITSTREAM pode ser transmitido, então, como o BitStreamExpression para a cláusula PARSE.

O exemplo a seguir mostra como serializar a pasta XMLNSC e, em seguida, utilizar o resultado do ASBITSTREAM na cláusula PARSE. Início da mudança
DECLARE inCCSID INT InputProperties.CodedCharSetId;                     
DECLARE inEncoding INT InputProperties.Encoding;                        
DECLARE inBitStream BLOB ASBITSTREAM(InputRoot.XMLNSC, inEncoding, inCCSID);
CREATE LASTCHILD OF OutputRoot DOMAIN('MRM')                            
       PARSE(inBitStream, inEncoding, inCCSID, 'DP3UK14002001',         
             'TestCase', 'XML1', options); 
Fim da mudança

Quando a instrução PARSE é processada, quaisquer expressões da cláusula PARSE são avaliadas. Será emitida uma exceção se qualquer uma das seguintes expressões não resultar em um valor não nulo do tipo apropriado:

Cláusula Tipo Valor Padrão
OPTIONS Número Inteiro RootBitStream & ValidateNone
ENCODING Número Inteiro 0
CCSID Número Inteiro 0
SET Caractere Cadeia de comprimento zero
TYPE Caractere Cadeia de comprimento zero
FORMAT Caractere Cadeia de comprimento zero

Embora a cláusula OPTIONS aceite qualquer expressão que retorna um valor de tipo inteiro, ela apenas é significativa para gerar valores de opções da lista de constantes fornecidas, utilizando a função BITOR se mais de uma opção for requerida.

Depois de gerado, o valor se torna um inteiro e pode ser salvo em uma variável ou transmitido como um parâmetro para uma função, além de ser utilizado diretamente com uma instrução CREATE. A lista de constantes definidas globalmente é:
        Validate master options...
        ValidateContentAndValue
                ValidateValue		-- Pode ser utilizado com ValidateContent
                ValidateContent		-- Pode ser utilizado com ValidateValue
        ValidateNone

        Validate failure action options...
                ValidateException
        ValidateExceptionList
        ValidateLocalError
        ValidateUserTrace

        Validate value constraints options...
        ValidateFullConstraints
        ValidateBasicConstraints

        Validate fix up options...
        ValidateFullFixUp
        ValidateNoFixUp

       Validate timing options...
                ValidateComplete
        ValidateImmediate
        ValidateDeferred
Notas:
  1. A opção ValidateFullFixUp está reservada para uso futuro. Selecionar ValidateFullFixUp fornece comportamento idêntico para ValidateNoFixUp.
  2. A opção ValidateFullConstraints está reservada para uso futuro. Selecionar ValidateFullConstraints fornece comportamento idêntico para ValidateBasicConstraints.
  3. Para obter detalhes completos sobre as opções de validação, consulte Propriedades de Validação.
  4. As opções para Validar a Temporização correspondem às opções para Analisar a Temporização e, em específico, ValidateDeferred corresponde a Analisar a Temporização na Demanda.

Você pode especificar apenas uma opção de cada grupo, com exceção de ValidateValue e ValidateContent que podem ser utilizadas em conjunto para obter a validação do conteúdo e do valor. Se você não especificar uma opção em um grupo, a opção em negrito será utilizada.

A cláusula ENCODING aceita qualquer expressão que retorne um valor de tipo integer. No entanto, apenas será significativo gerar valores de opções a partir da lista de constantes fornecidas:
       MQENC_INTEGER_NORMAL
       MQENC_INTEGER_REVERSED
       MQENC_DECIMAL_NORMAL
       MQENC_DECIMAL_REVERSED
       MQENC_FLOAT_IEEE_NORMAL
       MQENC_FLOAT_IEEE_REVERSED
       MQENC_FLOAT_S390

Os valores utilizados para a cláusula CCSID seguem o sistema de numeração normal. Por exemplo, 1200 = UCS-2, 1208 = UTF-8.

Para cláusulas ausentes, são utilizados os valores padrão especificados. Utilize o CCSID e os valores padrão de codificação, pois utilizam seus valores da codificação e das configurações de CCSID do gerenciador de filas.

Da mesma forma, utilizar os valores padrão para cada uma das opções de conjunto de mensagens, tipo e formato é útil, pois muitos analisadores não requerem informações sobre conjunto de mensagens, tipo ou formato e, portanto, qualquer valor válido é suficiente.

Depois que todas as expressões tiverem sido avaliadas, um fluxo de bits é analisado utilizando os resultados das expressões.
Nota: Como essa função possui um grande número de cláusulas, uma sintaxe alternativa é suportada, na qual os parâmetros são fornecidos como uma lista separada por vírgulas em vez de separada por cláusulas nomeadas. Nesse caso, as expressões devem estar na seguinte ordem:
ENCODING -> CCSID -> SET -> TYPE -> FORMAT -> OPTIONS

A lista pode ser truncada em qualquer ponto e uma expressão totalmente vazia pode ser utilizada em quaisquer cláusulas nas quais você não fornece um valor.

Exemplos de como Utilizar a Instrução CREATE

  1. O exemplo a seguir cria o campo especificado:
    CREATE FIELD OutputRoot.XMLNS.Data;
  2. O exemplo a seguir cria um campo sem nome, tipo ou valor como o primeiro filho de ref1:
    CREATE FIRSTCHILD OF ref1;
  3. O exemplo a seguir cria um campo utilizando o tipo, nome e valor especificados:
    CREATE NEXTSIBLING OF ref1 TYPE NameValue NAME 'Price' VALUE 92.3;
  4. O exemplo a seguir cria um campo com um tipo e nome, mas sem valor; o campo será incluído antes do irmão indicador pela referência dinâmica (ref1):
    CREATE PREVIOUSSIBLING OF ref1 TYPE Name NAME 'Quantity';
  5. O exemplo a seguir cria um campo denominado Component e move a variável de referência targetCursor para apontar:
    CREATE FIRSTCHILD OF
    targetCursor AS targetCursor NAME 'Component';
  6. O exemplo a seguir cria um novo campo como o irmão à direita do campo apontado pela variável de referência targetCursor tendo o mesmo tipo e nome que esse campo. A instrução então move targetCursor para apontar o novo campo:
    CREATE NEXTSIBLING OF targetCursor AS targetCursor REPEAT;
  7. O exemplo a seguir mostra como utilizar a cláusula PARSE:
    DECLARE bodyBlob BLOB ASBITSTREAM(InputRoot.XMLNS, InputProperties.Encoding,
     InputProperties.CodedCharSetId);
    DECLARE creationPtr REFERENCE TO OutputRoot;
    CREATE LASTCHILD OF creationPtr DOMAIN('XMLNS') PARSE(bodyBlob,
                        InputProperties.Encoding,
     InputProperties.CodedCharSetId);

    Este exemplo pode ser estendido para mostrar a serialização e a análise de um campo ou pasta:

    DECLARE bodyBlob BLOB ASBITSTREAM(InputRoot.XMLNS.TestCase.myFolder,
                        InputProperties.Encoding,
    InputProperties.CodedCharSetId,",",",FolderBitStream);
    DECLARE creationPtr REFERENCE TO OutputRoot;
    CREATE LASTCHILD OF creationPtr DOMAIN('XMLNS') PARSE(bodyBlob,
                        InputProperties.Encoding,
    InputProperties.CodedCharSetId,",",",FolderBitStream);
  8. O exemplo a seguir mostra como utilizar o operando IDENTITY:
    CREATE FIELD OutputRoot.XMLNS.TestCase.Root IDENTITY (XML.ParserRoot)Root;
    CREATE FIELD OutputRoot.XMLNS.TestCase.Root.Attribute
           IDENTITY (XML.Attribute)NSpace1:Attribute VALUE 'Attrib Value';
    CREATE LASTCHILD OF OutputRoot.XMLNS.TestCase.Root
           IDENTITY (XML.Element)NSpace1:Element1[1] VALUE 'Element 1 Value';
    CREATE LASTCHILD OF OutputRoot.XMLNS.TestCase.Root
           IDENTITY (XML.Element)NSpace1:Element1[2] VALUE 'Element 2 Value';

    Isso produz a seguinte mensagem de saída:

    <TestCase>
     <Root xmlns:NS1="NSpace1" NS1:Attribute="Attrib Value">
      <NS1:Element1>Element 1 Value</NS1:Element1>
      <NS1:Element1>Element 2 Value</NS1:Element1>
     </Raiz>
    </TestCase>
  9. O exemplo a seguir mostra como utilizar a cláusula DOMAIN para evitar perder informações exclusivas para o analisador XMLNS ao ocorrer uma cópia improvável do analisador:
    DECLARE bodyBlob BLOB ASBITSTREAM(InputRoot.XMLNS, InputProperties.Encoding,
    InputProperties.CodedCharSetId);
    CREATE FIELD Environment.Variables.myXMLTree;
    DECLARE creationPtr REFERENCE TO Environment.Variables.myXMLTree;
    CREATE FIRSTCHILD OF creationPtr DOMAIN('XMLNS') PARSE(bodyBlob,
                        InputProperties.Encoding,
    InputProperties.CodedCharSetId);

Um Exemplo de Instrução CREATE

Este exemplo fornece o ESQL e uma mensagem de entrada de amostra, que produzem juntos a mensagem de saída no final do exemplo.

CREATE COMPUTE MODULE CreateStatement_Compute
	CREATE FUNCTION Main() RETURNS BOOLEAN
	BEGIN
	  CALL CopyMessageHeaders();

        CREATE FIELD OutputRoot.XMLNS.TestCase.description TYPE NameValue VALUE 'This is my TestCase' ;
        DECLARE cursor REFERENCE TO OutputRoot.XMLNS.TestCase;
        CREATE FIRSTCHILD OF cursor Domain('XMLNS')
               NAME 'Identifier' VALUE InputRoot.XMLNS.TestCase.Identifier;
        CREATE LASTCHILD  OF cursor Domain('XMLNS') NAME 'Sport' VALUE InputRoot.XMLNS.TestCase.Sport;
        CREATE LASTCHILD  OF cursor Domain('XMLNS') NAME 'Date' VALUE InputRoot.XMLNS.TestCase.Date;
        CREATE LASTCHILD  OF cursor Domain('XMLNS') NAME 'Type' VALUE InputRoot.XMLNS.TestCase.Type;
        CREATE FIELD cursor.Division[1].Number TYPE NameValue VALUE 'Premiership';
        CREATE FIELD cursor.Division[1].Result[1].Number TYPE NameValue VALUE '1' ;
        CREATE FIELD cursor.Division[1].Result[1].Home TYPE Name;
        CREATE LASTCHILD OF cursor.Division[1].Result[1].Home NAME 'Team' VALUE 'Liverpool' ;
        CREATE LASTCHILD OF cursor.Division[1].Result[1].Home NAME 'Score' VALUE '4';
        CREATE FIELD cursor.Division[1].Result[1].Away TYPE Name;
        CREATE LASTCHILD OF cursor.Division[1].Result[1].Away NAME 'Team' VALUE 'Everton';
        CREATE LASTCHILD OF cursor.Division[1].Result[1].Away NAME 'Score' VALUE '0';
        CREATE FIELD cursor.Division[1].Result[2].Number TYPE NameValue VALUE '2';
        CREATE FIELD cursor.Division[1].Result[2].Home TYPE Name;
        CREATE LASTCHILD OF cursor.Division[1].Result[2].Home NAME 'Team' VALUE 'Manchester United';
        CREATE LASTCHILD OF cursor.Division[1].Result[2].Home NAME 'Score' VALUE '2';
        CREATE FIELD cursor.Division[1].Result[2].Away TYPE Name;
        CREATE LASTCHILD OF cursor.Division[1].Result[2].Away NAME 'Team' VALUE 'Arsenal';
        CREATE LASTCHILD OF cursor.Division[1].Result[2].Away NAME 'Score' VALUE '3';
        CREATE FIELD cursor.Division[2].Number TYPE NameValue VALUE '2';
        CREATE FIELD cursor.Division[2].Result[1].Number TYPE NameValue VALUE '1';
        CREATE FIELD cursor.Division[2].Result[1].Home TYPE Name;
        CREATE LASTCHILD OF cursor.Division[2].Result[1].Home NAME 'Team' VALUE 'Port Vale';
        CREATE LASTCHILD OF cursor.Division[2].Result[1].Home NAME 'Score' VALUE '9' ;
        CREATE FIELD cursor.Division[2].Result[1].Away TYPE Name;
        CREATE LASTCHILD OF cursor.Division[2].Result[1].Away NAME 'Team' VALUE 'Brentford';
        CREATE LASTCHILD OF cursor.Division[2].Result[1].Away NAME 'Score' VALUE '5';

	END;

	CREATE PROCEDURE CopyMessageHeaders() BEGIN
		DECLARE I INTEGER 1;
		DECLARE J INTEGER CARDINALITY(InputRoot.*[]);
		WHILE I < J DO
			SET OutputRoot.*[I] = InputRoot.*[I];
			SET I = I + 1;
		END WHILE;
	END;

END MODULE;
Conceitos relacionados
Visão Geral do ESQL
Especificando Espaços de Nomes na Propriedade Tipo de Mensagem
Mensagens de Várias Partes
Tarefas relacionadas
Desenvolvendo ESQL
Trabalhando com Mensagens e Fluxos de Bits XML
Referências relacionadas
Diagramas de Sintaxe: Tipos Disponíveis
instruções ESQL
função ASBITSTREAM
Avisos | Marcas Registradas | Downloads | Biblioteca | Suporte | Feedback

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

ak04950_