CREATE문은 새 메시지 필드를 작성합니다.
새 메시지 필드는 주어진 위치(CREATE FIELD)나 현재 존재하는 위치(CREATE... OF...)와 관련하여 위치합니다. 새 필드는 대상 필드 참조가 수정 가능한 메시지(예: Environment, InputLocalEnvironment, OutputLocalEnvironment, OutputRoot 또는 OutputExceptionList)를 가리키는 경우에만 작성할 수 있습니다.
FIELD절이 포함되어 있는 경우 target에 의해 지정된 필드가 탐색되며(필요하면 필드를 작성하여) values절이나 from절이 실행됩니다. 이러한 형식의 CREATE문이 항상 모든 필드를 작성하는 것은 아닙니다. 이 명령문은 주어진 필드가 존재하는지만 확인합니다.
SET OutputRoot.XML.Message.Structure[2].Field = ...
최소한 하나의 Structure 인스턴스가 이미 메시지에 있어야 합니다. 즉, 트리에서 작성된 필드는 루트에서 필드 참조에 식별된 필드까지의 직접 경로에 있는 것 뿐입니다.
PREVIOUSSIBLING, NEXTSIBLING, FIRSTCHILD, 또는 LASTCHILD 절이 있는 경우, 대상에 의해 지정된 필드가 FIELD절에 대해 정확히 동일한 방식으로 탐색됩니다(필요하면 필드를 작성하여). 그러면 새 필드가 작성되어 지정된 위치에 첨부됩니다(예를 들면, PREVIOUSSIBLING 또는 FIRSTCHILD로). 이러한 형식의 CREATE문은 항상 새 필드를 작성하고 지정된 위치에 놓습니다.
동일한 대상을 지정하는 두 개의 CREATE FIRSTCHILD OF 대상 명령문이 실행된 경우 두 번째 명령문은 새 필드를 대상의 첫 번째 하위로 작성하고 이전에 작성된 첫 번째 하위를 메시지 트리의 오른쪽으로 옮깁니다(따라서 더 이상 첫 번째 하위가 아님). 마찬가지로 CREATE LASTCHILD OF 대상은 대상 필드를 탐색하고 이전의 마지막 하위를 왼쪽으로 옮겨서 새 필드를 가장 오른쪽 하위로 추가합니다.
CREATE PREVIOUSSIBLING OF 대상은 대상에 의해 지정된 필드의 바로 왼쪽에 필드를 작성하고(따라서 트리의 깊이가 변경되지 않음) 마찬가지로 CREATE NEXTSIBLING OF 대상이 대상에 의해 지정된 필드의 바로 오른쪽에 필드를 작성합니다. PREVIOUSSIBLING 또는 NEXTSIBLING을 작성할 때 REPEAT 키워드를 사용하여 새 필드의 유형과 이름을 현재 필드에서 복사해야 함을 지정할 수 있습니다.
AS 절:
AS절이 제공된 경우 이름 지정된 참조 변수가 새로 작성된 필드를 가리키도록 이동됩니다. 이것은 일부 추가 처리에 새 필드를 포함시키려고 할 수 있기 때문에 유용합니다.
DOMAIN 절:
있는 경우, DOMAIN절은 새 필드를 지정된 유형의 새 구문 분석기와 연관시킵니다. 이 절은 루트 필드 이름(예: XML 또는 MQRFH2)을 예상합니다. DOMAIN절이 제공되었지만 제공된 값이 길이가 0인 문자열인 경우 대상에 의해 지정된 필드를 소유하는 구문 분석기와 동일한 유형의 새 구문 분석기가 작성됩니다. 제공된 도메인 이름이 CHARACTER 데이터 유형이 아니거나 값이 널(null)인 경우 예외가 발생합니다. DOMAIN절을 FIELD절과 함께 지정하지 마십시오. 새 필드가 작성되지 않을 수도 있습니다.
REPEAT 절:
VALUES 절:
VALUES절의 경우 적당한 데이터 유형(유형으로는 INTEGER, 이름으로는 CHARACTER 및 값으로는 스칼라 유형)을 리턴하는 표현식을 사용하여 유형, 이름 및 값(또는 이들의 서브세트)을 지정할 수 있습니다. 유형 또는 이름으로 제공된 값이 널(null)인 경우 예외가 발생합니다.
NAMES 절:
NAMESPACE | NAME | 요소에 지정된 이름 |
---|---|---|
없음 | 없음 | 요소에 이름이 없음(이름 플래그가 자동으로 설정되지 않음). |
없음 | 있음 | 디폴트 네임스페이스의 이름이 요소에 부여됨 |
있음 | 없음 | 주어진 네임스페이스의 비어 있는 이름이 요소에 부여됨 |
있음 | 있음 | 주어진 네임스페이스의 주어진 이름이 요소에 부여됨 |
IDENTITY 피연산자는 TYPE 및 NAME절에서 단일 경로 요소를 사용하고 여기서 경로 요소에는 type, namespace, name, index가 (가장 많이) 포함됩니다. 이 요소는 작성할 요소의 유형, 네임스페이스, 이름 및 색인을 지정하고 필드 참조 주제에 설명된 규칙을 준수합니다(ESQL 필드 참조). 예를 들면 다음과 같습니다.
IDENTITY (XML.attribute)Space1:Name1[42]
IDENTITY 피연산자 사용 방법에 대해서는 아래 예 섹션을 참조하십시오.
FROM 절:
FROM절의 경우 새 필드의 유형, 이름 및 값은 SourceFieldReference가 가리키는 필드에서 취합니다. 기존의 대상 하위 필드가 분리되고(FIELD 절의 경우 필드가 이미 존재할 수 있음) 새 필드에 소스 필드의 하위, 최하위 등의 사본이 제공됩니다.
PARSE 절:
PARSE절이 있는 경우 제공된 비트스트림에서 새로 작성된 필드의 아래에 서브트리가 빌드됩니다. 이를 수행하기 위한 알고리즘은 구문 분석기마다 다르고 지정된 옵션에 따라 다릅니다. 모든 구문 분석기가 모드 RootBitStream을 지원하며 이 모드에서 트리 작성 알고리즘은 입력 노드에 의해 사용되는 것과 동일합니다.
일부 구문 분석기는 두 번째 모드인 FolderBitStream도 지원하며 이 모드를 사용하여 ASBITSTREAM 함수(ASBITSTREAM 함수 참조)에 의해 작성된 비트스트림에서 서브트리를 생성합니다.
명령문이 처리될 때 PARSE절 표현식이 평가됩니다. 다음의 표현식으로 인해 적절한 유형의 널(null)이 아닌 값이 나타나지 않을 경우 예외가 발생합니다.
절 | 유형 | 디폴트 값 |
---|---|---|
Options | integer | RootBitStream & ValidateNone |
Encoding | integer | 0 |
Ccsid | integer | 0 |
Message set | character | 0 길이 문자열 |
Message type | character | 0 길이 문자열 |
Message format | character | 0 길이 문자열 |
OPTIONS절이 integer 유형의 값을 리턴하는 표현식을 승인하기는 하지만 이는 둘 이상의 옵션이 필요한 경우 BITOR 함수를 사용하여 제공된 상수의 목록에서 옵션 값을 생성하는 경우에만 의미가 있습니다.
마스터 유효성 검증 옵션... ValidateContentAndValue ValidateValue -- ValidateContent와 함께 사용할 수 있음 ValidateContent -- ValidateValue와 함께 사용할 수 있음 ValidateNone 실패 조치 유효성 검증 옵션... ValidateException ValidateExceptionList ValidateLocalError ValidateUserTrace 값 제한조건 유효성 검증 옵션... ValidateFullConstraints ValidateBasicConstraints 수정사항 유효성 검증 옵션... ValidateFullFixUp ValidateNoFixUp 타이밍 구문 분석 옵션... ParseComplete ParseImmediate ParseOnDemand
각 그룹에서 하나의 옵션만을 지정할 수 있지만 내용 및 값의 유효성 검증을 확보하기 위해 함께 사용할 수 있는 ValidateValue 및 ValidateContent의 경우는 예외입니다. 그룹 내의 옵션을 지정하지 않으면 굵은체의 옵션이 사용됩니다.
MQENC_INTEGER_NORMAL MQENC_INTEGER_REVERSED MQENC_DECIMAL_NORMAL MQENC_DECIMAL_REVERSED MQENC_FLOAT_IEEE_NORMAL MQENC_FLOAT_IEEE_REVERSED MQENC_FLOAT_S390
CCSID절에 대해 사용된 값은 정상 번호 지정 시스템을 따릅니다. 예를 들면, 1200 = UCS-2, 1208 = UTF-8과 같습니다.
비어 있는 절의 경우 제공된 디폴트 값이 사용됩니다. CCSID 및 인코딩 디폴트 값은 큐 관리자의 인코딩 및 CCSID 설정에서 해당 값을 가져오므로 이 디폴트 값을 사용하십시오.
마찬가지로 많은 구문 분석기에서는 메시지 세트, 유형 또는 형식 정보가 필요하지 않기 때문에(따라서 올바른 값이면 충분함) 각 메시지 세트, 유형 및 형식 옵션의 디폴트 값을 사용하면 유용합니다.
ENCODING -> CCSID -> SET -> TYPE -> FORMAT -> OPTIONS
목록은 어느 지점에서나 자를 수 있으며 값을 제공하지 않은 절에 대해 완전히 비어 있는 표현식을 사용할 수 있습니다.
CREATE FIELD OutputRoot.XML.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';다음 예는 해당 필드와 동일한 유형과 이름을 갖는 참조 변수 targetCursor가 가리키는 필드의 오른쪽 동위로 새 필드를 작성합니다. 그런 다음 명령문은 새 필드를 가리키도록 targetCursor를 이동시킵니다.
CREATE NEXTSIBLING OF targetCursor AS targetCursor REPEAT;
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);
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';
이 명령문의 순서는 다음 출력 메시지를 생성하게 됩니다.
<TestCase> <Root xmlns:NS1="NSpace1" NS1:Attribute="Attrib Value"> <NS1:Element1>Element 1 Value</NS1:Element1> <NS1:Element1>Element 2 Value</NS1:Element1> </Root> </TestCase>
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);
이 예는 샘플 ESQL과 입력 메시지를 제공하며, 이 예의 끝에 출력 메시지를 생성합니다.
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;