A instrução CREATE cria um novo campo de mensagem.
>>-CREATE--Qualifier--Target--+----------+----------------------> '-AsClause-' >--+------------------+--+-------------------+----------------->< | (1) | | (2) | '-DomainClause-----' +-RepeatClauses-----+ +-ValuesClauses-----+ +-FromClause--------+ | (3) | '-ParseClause-------' Qualificador |--+-FIELD-------------------+----------------------------------| '-+-PREVIOUSSIBLING-+--OF-' +-NEXTSIBLING-----+ +-FIRSTCHILD------+ '-LASTCHILD-------' AsClause |--AS--AliasFieldReferenceVariable------------------------------| DomainClause |--DOMAIN--expression-------------------------------------------| RepeatClauses |--REPEAT--+---------------------+------------------------------| '-VALUE-- -expression-' ValuesClauses |--+------------------+--+-------------------+------------------| '-| NamesClauses |-' '-VALUE--expression-' NamesClauses (4) |--+-+------------------+--+-----------------------+--+------------------+-----+--| | '-TYPE--Expression-' '-NAMESPACE--Expression-' '-NAME--Expression-' | '-IDENTITY--PathElement-----------------------------------------------------' FromClause |--FROM--SourceFieldReference-----------------------------------| ParseClause |--PARSE--(--BitStreamExpression--+------------------------------+--)--| | .-<<-----------------------. | | V | | '---+-ENCODING--expression-+-+-' +-CCSID--expression----+ +-SET--expression------+ +-TYPE--expression-----+ +-FORMAT--expression---+ '-Options--------------' Opções |--OPTIONS--+-----------+---------------------------------------| '-expressão-'
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.
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:
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:
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 a seguir para obter informações sobre como usar o operando IDENTITY.
Cláusula FROM:
Para a cláusula FROM, o tipo, nome e valor do novo campo são tomados de SourceFieldReference. Qualquer campo-filho existente do destino é desanexado (o campo pode já existir no caso de uma cláusula FIELD) e o novo campo recebe cópias dos filhos do campo de 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 contendo 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.
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);
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 | Inteiro | 0 |
SET | Caractere | Cadeia de comprimento zero |
TYPE | Caractere | Cadeia de comprimento zero |
FORMAT | Caractere | Cadeia de comprimento zero |
Para obter detalhes da sintaxe da cláusula TYPE, consulte Especificando Namespaces na Propriedade Mensagem.
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.
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 timing options...
ValidateComplete
ValidateImmediate
ValidateDeferred
APIs equivalentes a C e Java™
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.
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.
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.
CREATE FIELD OutputRoot.XMLNS.Data;
CREATE FIRSTCHILD OF ref1;
CREATE NEXTSIBLING OF ref1 TYPE NameValue NAME 'Price' VALUE 92.3;
CREATE PREVIOUSSIBLING OF ref1 TYPE Name NAME 'Quantity';
CREATE FIRSTCHILD OF
targetCursor AS targetCursor NAME 'Component';
CREATE NEXTSIBLING OF targetCursor AS targetCursor REPEAT;
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);
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>
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);
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;