Die Anweisung CREATE erstellt ein neues Nachrichtenfeld.
>>-CREATE--Qualifikationsmerkmal--Ziel--+------------+----------> '-AS-Klausel-' >--+------------------+--+-------------------+----------------->< | (1) | | (2) | '-DomainClause-----' +-RepeatClauses-----+ +-ValuesClauses-----+ +-FromClause--------+ | (3) | '-ParseClause-------' Qualifikationsmerkmal |--+-FIELD-------------------+----------------------------------| '-+-PREVIOUSSIBLING-+--OF-' +-NEXTSIBLING-----+ +-FIRSTCHILD------+ '-LASTCHILD-------' AS-Klausel |--AS--AliasFieldReferenceVariable------------------------------| DOMAIN-Klausel |--DOMAIN--Ausdruck---------------------------------------------| REPEAT-Klausel |--REPEAT--+-------------------+--------------------------------| '-VALUE-- -Ausdruck-' Werteklauseln |--+------------------+--+-----------------+--------------------| '-| NamesClauses |-' '-VALUE--Ausdruck-' NamesClauses |--+-+----------------+--+---------------------+--+----------------+-+--| | '-TYPE--Ausdruck-' '-NAMESPACE--Ausdruck-' '-NAME--Ausdruck-' | '-IDENTITY--Pfadelement-------------------------------------------' FROM-Klausel |--FROM--SourceFieldReference-----------------------------------| PARSE-Klausel |--PARSE--(--Bitstromausdruck--+----------------------------+--)--| | .-<<---------------------. | | V | | '---+-OPTIONS--Ausdruck--+-+-' +-ENCODING--Ausdruck-+ +-CCSID--Ausdruck----+ +-SET--Ausdruck------+ +-TYPE--Ausdruck-----+ '-FORMAT--Ausdruck---'
Das neue Nachrichtenfeld wird an einer vorgegebenen Position (CREATE FIELD) oder relativ zu einer bereits vorhandenen Position (CREATE ... OF...) erstellt. Die Erstellung neuer Felder ist nur möglich, wenn der Zielfeldverweis auf eine Nachrichtenstruktur zeigt, die Änderungen zulässt (z. B. Environment, InputLocalEnvironment, OutputLocalEnvironment, OutputRoot oder OutputExceptionList).
Wenn die FIELD-Klausel angegeben ist, wird zu dem durch die Zielanweisung angegebenen Feld navigiert (bei Bedarf werden die Felder erstellt), und alle Werteklauseln und die FROM-Klausel werden ausgeführt. Mit dieser Form der CREATE-Anweisung werden jedoch nicht zwangsläufig Felder erstellt, sondern sie stellt nur sicher, dass die angegebenen Felder vorhanden sind.
SET OutputRoot.XML.Message.Structure[2].Field = ...
In diesem Fall muss in der Nachricht bereits eine Instanz von "Structure" vorhanden sein. Dies bedeutet, dass nur die Felder in der Baumstruktur erstellt werden, die sich im direkten Pfad von der Root zu dem Feld, auf das mit dem Feldverweis verwiesen wird, befinden.
Wenn eine PREVIOUSSIBLING-, NEXTSIBLING-, FIRSTCHILD- oder LASTCHILD-Klausel angegeben ist, wird auf dieselbe Weise wie bei der FIELD-Klausel zu dem durch die Zielanweisung angegebenen Feld navigiert (bei Bedarf werden die Felder erstellt). An der angegebenen Position wird dann ein neues Feld erstellt und eingefügt (z. B. als PREVIOUSSIBLING oder FIRSTCHILD). Mit diesem Format der CREATE-Anweisung wird immer ein neues Feld an der angegebenen Position erstellt.
Wenn Sie zwei Zielanweisungen CREATE FIRSTCHILD OF verwenden, die dasselbe Ziel angeben, erstellt die zweite Anweisung ein neues Feld als das erste untergeordnete Feld des Ziels und verschiebt das zuvor erstellte erste untergeordnete Feld in der Nachrichtenbaumstruktur nach rechts (sodass es nicht länger das erste untergeordnete Feld ist). Entsprechend navigiert die Zielanweisung CREATE LASTCHILD OF zum Zielfeld und fügt ganz rechts ein neues Feld hinzu, wobei es das bisherige letzte untergeordnete Feld nach links verschiebt.
Die Zielanweisung CREATE PREVIOUSSIBLING OF erstellt ein Feld unmittelbar links von dem durch diese Anweisung angegebenen Feld (sodass sich die Tiefe der Baumstruktur nicht ändert), und entsprechend erstellt die Zielanweisung CREATE NEXTSIBLING OF ein Feld unmittelbar rechts von dem durch diese Anweisung angegebenen Feld. Bei der Erstellung von PREVIOUSSIBLING oder NEXTSIBLING können Sie unter Verwendung des Schlüsselwortes REPEAT angeben, dass Art und Name des neuen Feldes aus dem aktuellen Feld übernommen werden sollen.
Falls die AS-Klausel vorhanden ist, wird die benannte Verweisvariable verschoben, so dass sie auf das neu erstellte Feld zeigt. Dies ist hilfreich, da neu erstellte Felder in der Regel in einen weiteren Bearbeitungsablauf einbezogen werden.
Ist die DOMAIN-Klausel angegeben, hat dies zur Folge, dass das neue Feld einem neuen Parser des angegebenen Typs zugeordnet wird. Diese Klausel erwartet einen Root-Feldnamen (z. B. XML oder MQRFH2). Wenn die DOMAIN-Klausel angegeben ist, aber nur eine Zeichenfolge mit Nulllänge enthält, wird ein neuer Parser desselben Typs wie der Parser, der Eigner des durch die Zielanweisung angegebenen Feldes ist, erstellt. Es wird eine Ausnahme ausgegeben, wenn der angegebene Domänenname nicht den Datentyp CHARACTER hat oder wenn er dem Wert NULL entspricht. Verwenden Sie die FIELD-Klausel nicht mit der DOMAIN-Klausel, da in diesem Fall nicht sicher ist, ob ein neues Feld erstellt wird.
Für die Werteklauseln TYPE, NAME und VALUE (oder eine Untermenge davon) kann jeder Ausdruck angegeben werden, der einen geeigneten Datentyp zurückgibt (Integer für TYPE, Zeichenfolge für NAME und jeder beliebige Skalartyp für VALUE). Es wird eine Ausnahme ausgegeben, wenn für TYPE oder NAME der Wert NULL angegeben wurde.
NAMESPACE | NAME | Element ist wie folgt benannt |
---|---|---|
Nein | Nein | Das Element ist unbenannt (das Namenskennzeichen wird nicht automatisch gesetzt) |
Nein | Ja | Das Element erhält den Namen im Standard-Namespace. |
Ja | Nein | Dem Element wird der leere Name im angegebenen Namespace zugeordnet |
Ja | Ja | Dem Element wird der angegebene Name im angegebenen Namespace zugeordnet |
Die IDENTITY-Klausel akzeptiert ein einzelnes Pfadelement anstelle der TYPE- und NAME-Klauseln. Für die IDENTITY-Klauseln gelten alle die im Abschnitt zu den Feldverweisen beschriebenen Regeln (siehe Feldverweise in ESQL).
Für die FROM-Klausel werden Typ, Name und Wert des neuen Feldes aus dem Feld, auf das über SourceFieldReference (Quellenfeldverweis) verwiesen wird, übernommen. Alle bestehenden untergeordneten Felder des Ziels werden abgehängt (das Feld könnte im Fall einer FIELD-Klausel bereits bestehen), und das neue Feld erhält Kopien der dem Quellfeld untergeordneten Felder.
Wenn eine PARSE-Klausel vorhanden ist, wird unter dem neu erstellten Feld aus dem bereitgestellten Bitstrom eine untergeordnete Baumstruktur erstellt. Der hierzu verwendete Algorithmus hängt vom Parser und den angegebenen Optionen ab. Alle Parser unterstützen den Modus 'RootBitStream'. In diesem Modus wird zur Erstellung der Baumstruktur der Algorithmus des Empfangsknotens verwendet.
Einige Parser unterstützen einen zweiten Modus, nämlich 'FolderBitStream'. In diesem Modus wird eine untergeordnete Baumstruktur von einem Bitstrom, der mit der Funktion ASBITSTREAM erstellt wurde, generiert (siehe Funktion ASBITSTREAM).
Wenn die Anweisung verarbeitet wird, werden alle Ausdrücke für PARSE-Klauseln ausgewertet. Es wird eine Ausnahmebedingung ausgegeben, wenn einer der folgenden Ausdrücke nicht einen Nicht-Null-Wert des entsprechenden Typs zurückgibt:
Klausel | Typ | Standardwert |
---|---|---|
OPTIONS | Integer | RootBitStream & ValidateNone |
ENCODING | Integer | 0 |
CCSID | Integer | 0 |
Nachrichtengruppe | Zeichen | Zeichenfolge mit einer Länge von '0' |
Nachrichtentyp | Zeichen | Zeichenfolge mit einer Länge von '0' |
Nachrichtenformat | Zeichen | Zeichenfolge mit einer Länge von '0' |
Obwohl die OPTIONS-Klausel alle Ausdrücke akzeptiert, die einen Wert des Typs INTEGER zurückgeben, macht es nur Sinn, Optionswerte aus der Liste der verfügbaren Konstanten zu generieren (unter Verwendung der BITOR-Funktion, wenn mehrere Optionen erforderlich sind).
Masteroptionen für Validierung... ValidateContentAndValue ValidateValue -- Kann verwendet werden mit ValidateContent ValidateContent -- Kann verwendet werden mit ValidateValue ValidateNone Optionen für Fehlerauswertung... ValidateException ValidateExceptionList ValidateLocalError ValidateUserTrace Optionen für Auswertungen von Wertvorgaben... ValidateFullConstraints ValidateBasicConstraints Optionen für Auswertungen von Korrekturen... ValidateFullFixUp ValidateNoFixUp Optionen für Ablaufsteuerung bei der Validierung... ValidateComplete ValidateImmeditate ValidateDeferred
Sie können jeweils nur eine Option aus jeder Gruppe auswählen. Dies gilt nicht für ValidateValue und ValidateContent. Diese zwei Optionen können für die Inhalt- und Wertevalidierung zusammen verwendet werden. Wenn Sie keine Option in einer Gruppe angeben, wird die fettgedruckte Option verwenden.
MQENC_INTEGER_NORMAL MQENC_INTEGER_REVERSED MQENC_DECIMAL_NORMAL MQENC_DECIMAL_REVERSED MQENC_FLOAT_IEEE_NORMAL MQENC_FLOAT_IEEE_REVERSED MQENC_FLOAT_S390
Die Werte für die CCSID-Klausel entsprechen dem normalen Nummerierungssystem. Beispiel: 1200 = UCS-2, 1208 = UTF-8.
Für ABSENT-Klauseln werden die angegebenen Standardwerte verwendet. Es wird empfohlen, die Standardwerte für die CCSID und die Codierung zu verwenden, da diese aus den Einstellungen für die Codierung und die CCSID des WS-Managers übernommen werden.
Dementsprechend ist die Verwendung von Standardwerten für die Nachrichtengruppen-, Typ- und Formatoptionen hilfreich, da für viele Parser Informationen zu Nachrichtengruppen-, Typ- und Formatoptionen nicht erforderlich sind, so dass die Angabe eines beliebigen Wertes möglich ist.
ENCODING -> CCSID -> SET -> TYPE -> FORMAT -> OPTIONS
Die Liste kann an jeder beliebigen Stelle abgeschnitten werden und für alle Klauseln, für die Sie keinen Wert angeben, können Sie einen ganz leeren Ausdruck verwenden.
CREATE FIELD OutputRoot.XML.Data;Im folgenden Beispiel wird ein Feld ohne Angabe von NAME, TYPE oder VALUE als erstes untergeordnetes Feld von ref1 erstellt:
CREATE FIRSTCHILD OF ref1;Im folgenden Beispiel wird ein Feld mit den angegebenen Werten für TYPE, NAME und VALUE erstellt:
CREATE NEXTSIBLING OF ref1 TYPE NameValue NAME 'Price' VALUE 92.3;Im folgenden Beispiel wird ein Feld mit Angaben für TYPE und NAME, aber ohne eine Angabe für VALUE erstellt, das dem Feld der gleichen Ebene (wird über den dynamischen Feldverweis ref1 angegeben) vorangestellt wird:
CREATE PREVIOUSSIBLING OF ref1 TYPE Name NAME 'Quantity';
CREATE FIRSTCHILD OF targetCursor AS targetCursor NAME 'Component';Das folgende Beispiel erstellt ein neues Feld als rechtes Element in derselben Ebene wie das Feld, auf das die Verweisvariable 'targetCursor' zeigt; Art und Name des letzteren Feldes werden für das neue Feld übernommen. Anschließend verschiebt die Anweisung die Verweisvariable 'targetCursor', so dass sie auf das neue Feld zeigt:
CREATE NEXTSIBLING OF targetCursor AS targetCursor REPEAT;
Im folgenden Beispiel wird die Verwendung der PARSE-Klausel veranschaulicht:
DECLARE bodyBlob BLOB ASBITSTREAM(InputRoot.XML, InputProperties.Encoding, InputProperties.CodedCharSetId); DECLARE creationPtr REFERENCE TO OutputRoot; CREATE LASTCHILD OF creationPtr DOMAIN('XML') PARSE(bodyBlob, InputProperties.Encoding, InputProperties.CodedCharSetId);
DECLARE bodyBlob BLOB ASBITSTREAM(InputRoot.XML.TestCase.myFolder, InputProperties.Encoding, InputProperties.CodedCharSetId,",",",FolderBitStream); DECLARE creationPtr REFERENCE TO OutputRoot; CREATE LASTCHILD OF creationPtr DOMAIN('XML') PARSE(bodyBlob, InputProperties.Encoding, InputProperties.CodedCharSetId,",",",FolderBitStream);
DECLARE bodyBlob BLOB ASBITSTREAM(InputRoot.XML, InputProperties.Encoding, InputProperties.CodedCharSetId); CREATE FIELD Environment.Variables.myXMLTree; DECLARE creationPtr REFERENCE TO Environment.Variables.myXMLTree; CREATE FIRSTCHILD OF creationPtr DOMAIN('XML') PARSE(bodyBlob, InputProperties.Encoding, InputProperties.CodedCharSetId);
Dieses Beispiel enthält die ESQL-Anweisungen und eine Eingabenachricht. Als Ergebnis wird die am Ende des Beispiels gezeigte Ausgabenachricht erstellt.
CREATE COMPUTE MODULE CreateStatement_Compute CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN CALL CopyMessageHeaders(); CREATE FIELD OutputRoot.XML.TestCase.description TYPE NameValue VALUE 'This is my TestCase' ; DECLARE cursor REFERENCE TO OutputRoot.XML.TestCase; CREATE FIRSTCHILD OF cursor Domain('XML') NAME 'Identifier' VALUE InputRoot.XML.TestCase.Identifier; CREATE LASTCHILD OF cursor Domain('XML') NAME 'Sport' VALUE InputRoot.XML.TestCase.Sport; CREATE LASTCHILD OF cursor Domain('XML') NAME 'Date' VALUE InputRoot.XML.TestCase.Date; CREATE LASTCHILD OF cursor Domain('XML') NAME 'Type' VALUE InputRoot.XML.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;