DESC

내가 보려고 쓰는 블로그

«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Today
-
Yesterday
-
Total
-
  • [IBM] 새 Compute Node 작성하기 by ESQL
    ETC. 2020. 5. 22. 13:54
    반응형

    IIB의 메시지 플로우에서 Compute Node 를 추가한 뒤 더블클릭하면 .esql 파일이 열린다.
    아래와 같이 기본적인 소스가 작성되어있어 여기에 추가 작성하여 개발한다.

    BROKER SCHEMA MB_TEST -- 프로젝트명
    
    
    CREATE COMPUTE MODULE MB_TEST_SUBFLOW_Compute -- Compute 노드명
      CREATE FUNCTION Main() RETURNS BOOLEAN
      BEGIN
        -- CALL CopyMessageHeaders();
        -- CALL CopyEntireMessage();
        
        
        -- 데이터 처리 로직 추가
        
        
        RETURN TRUE;
      END;
    
      CREATE PROCEDURE CopyMessageHeaders() BEGIN
        DECLARE I INTEGER 1;
        DECLARE J INTEGER;
        SET J = CARDINALITY(InputRoot.*[]);
        WHILE I < J DO
          SET OutputRoot.*[I] = InputRoot.*[I];
          SET I = I + 1;
        END WHILE;
      END;
    
      CREATE PROCEDURE CopyEntireMessage() BEGIN
        SET OutputRoot = InputRoot;
      END;
    END MODULE;
    

     

    데이터 처리 과정에서 가장 많이 사용되는 몇가지 ESQL 구문들을 살펴보면 아래와 같다.
    변수관련 내용은 이전글에 언급하여 생략한다.

    1. IF
      IF i = 0 THEN
         SET size = 'small';
      ELSEIF i = 1 THEN
         SET size = 'medium';
      ELSEIF j = 4 THEN
         SET size = 'large';
      ELSE
         SET size = 'unknown';
      END IF;
      
      IF J> MAX THEN
        SET J = MAX;
        SET Limit = TRUE;
      END IF;

       

    2. WHILE
      DECLARE i INTEGER;
      SET i = 1;
      X : WHILE i <= 3 DO
        ...
        SET i = i + 1;
        END WHILE X;

       

    3. REPEAT
      명령문을 처리한 후 조건을 확인. JAVA의 Do While문과 동일한 구조라고 보면 된다.
      DECLARE i INTEGER;
      SET i = 1;
      X : REPEAT
        ...
        SET i = i + 1;
      UNTIL
        i>= 3
      END REPEAT X;

       

    4. THROW
      예외를 생성하기 위해 사용하는 키워드로 두가지 선택적 옵션이 있다.
      • CATALOG
        생략하는 경우 CATALOG는 IBM® Integration Bus 현재 버전 카탈로그로 기본 설정 
        현재 버전 메시지 카탈로그를 명시적으로 사용하려면 모든 운영 체제에서 BIPmsgs를 사용
      • MESSAGE
        생략하는 경우 기본 카탈로그(2951)에서 THROW문 사용을 위해 제공되는 메시지 블록의 기본값 메시지 번호로 설정
        THROW문에서 메시지 번호를 입력하는 경우 기본 카탈로그에서 2951부터 2999까지의 메시지 번호를 사용할 수 있다.
      CREATE FUNCTION getUserType( IN DATA CHAR ) RETURNS CHAR
      BEGIN
        DECLARE USER_TYPE CHAR;
        SET USER_TYPE = SUBSTRING(SUBSTRING(DATA AFTER 'userType=') BEFORE '&'); 
        
        IF(LENGTH(USER_TYPE) = 0 OR USER_TYPE IS NULL) THEN
          THROW USER EXCEPTION CATALOG 'BIPmsgs' MESSAGE 2951 VALUES('User Type is Null!');
        END IF; 
        RETURN USER_TYPE;
      END;

     

    또한 ESQL 에는 데이터 처리를 위한 기본 내장함수들도 존재한다.

    1. 날짜
      • CURRENT_DATE 
        현재 날짜. 매개변수(X)

      • CURRENT_TIME 
        현재 시간. 매개변수(X)

      • CURRENT_TIMESTAMP 
        현재 날짜와 현지 시간을 표시하는 ISO8601 TIMESTAMP. 매개변수(X)

      • EXTRACT 
        값에서 필드를 추출또는 계산하기위한 함수.

        [ 리턴값 유형 ] 
        1. 정수 (INTEGER)
          YEAR, MONTH, DAY, HOUR, MINUTE, DAYS, DAYOFYEAR, DAYOFWEEK, MONTHS, QUARTEROFYEAR, QUARTERS, WEEKS, WEEKOFYEAR, WEEKOFMONTH
        2. BOOLEAN
          ISLEAPYEAR
        3. 실수 (FLOAT)
          SECOND
        * 단, SourceDate가 NULL인 경우, 결과는 추출 유형에 상관없이 NULL

        EXTRACT (YEAR FROM CURRENT_DATE);
        EXTRACT (HOUR FROM LOCAL_TIMEZONE);
        
        EXTRACT (DAYS FROM DATE '2000-02-29'); -- '0001-01-01' ~ '2000-02-29' 까지 일 수
        EXTRACT (DAY FROM CURRENT_TIME); -- 실패
        EXTRACT (DAYOFYEAR FROM CURRENT_DATE); -- 현재 년도 1월 1일 부터 현재까지의 일 수
        EXTRACT (DAYOFYEAR FROM CURRENT_TIME); -- 실패
    2. 숫자
      ABS, CEIL, FLOOR, MOD, RAND 및 SIN, COS 등 삼각함수 까지 다양한 숫자 함수를 제공한다. 이는 특별한 매개변수는 없어 설명은 생략한다. (공식홈페이지 참고)

      - ROUND : 값을 주어진 자리 수까지 반올림하는 함수로 Rounding Mode 옵션을 다양하게 지정할 수 있다. 총 7 가지의 옵션 중 보편적인 세 가지만 살펴보면,
      1. ROUND_HALF_EVEN (기본값)
        양쪽 인접한 정수가 등거리가 아닌 경우 "가장 가까운 정수"를 향해서 반올림하며, 등거리인 경우에는 짝수를 향해 반올림합니다. 버려지는 소수의 왼쪽 숫자가 홀수인 경우 ROUND_HALF_UP처럼 작동하고, 짝수인 경우 ROUND_HALF_DOWN처럼 작동합니다. 이것은 일련의 계산을 반복적으로 적용할 때 누적 오류를 최소화하는 반올림 모드이며, 가끔 은행가 반올림이라고도 부릅니다.
      2. ROUND_DOWN
        0을 향해서 반올림합니다. 버려진 소수 앞의 숫자를 절대 증분시키지 않습니다(즉, 자릅니다). 이 반올림 모드에서는 계산된 값의 크기를 늘리지 않습니다.
      3. ROUND_HALF_UP
        양쪽 인접한 정수가 등거리가 아닌 경우 "가장 가까운 정수"를 향해서 반올림하며, 등거리인 경우에는 올림합니다. 버려지는 소수가 0.5 이상인 경우 ROUND_UP처럼 작동하고, 그렇지 않으면 ROUND_DOWN처럼 작동합니다. 이 반올림 모드가 학교에서 일반적으로 학습하는 반올림 모드입니다.
      4. ROUND_HALF_DOWN
        양쪽 인접한 정수가 등거리가 아닌 경우 "가장 가까운 정수"를 향해서 반올림하며, 등거리인 경우에는 내림합니다. 버려지는 소수가 0.5보다 큰 경우 ROUND_UP처럼 작동하고, 그렇지 않으면 ROUND_DOWN처럼 작동합니다.
    3. 문자열
      기본적으로 자주 사용하는 문자열 함수들은 모두 지원한다.
      CONTAINS, ENDSWITH, LEFT, LENGTH, LOWER 및 LCASE, LTRIM, OVERLAY, POSITION, REPLACE, REPLICATE, RIGHT, RTRIM, SPACE, STARTSWITH, SUBSTRING, TRANSLATE, TRIM, UPPER 및 UCASE
      1. LENGTH
        LENGTH('Hello World!'); -- 12
        LENGTH(''); -- 0
        LENGTH(NULL); -- NULL
      2. POSITION
        POSITION은 모든 데이터 유형(BIT, BLOB, CHARACTER)의 두 번째 문자열(SourceExpression)에 있는 한 문자열의 위치(SearchExpression)를 제공하는 정수를 리턴하며 위치 1은 소스 문자열의 첫 번째 문자를 뜻한다. 검색 문자열을 찾을 수 없으면 결과 값이 0 이다.
        - FROM : 검색 시작 위치 (기본은 1)
        - REPEAT : 소스 문자열 내에서 검색 문자열의 N 번째 발생의 위치. 반복 수가 음수인 경우 문자열은 FROM절에서 제공된 위치 또는 문자열의 끝(FROM절이 없는 경우)에서 검색.
        POSITION('Village' IN 'Hursley Village');   -- 9
        POSITION('Town' IN 'Hursley Village');   -- 0
        POSITION ('B' IN 'ABCABCABCABCABC'); -- 2
        POSITION ('A' IN 'ABCABCABCABCABC' FROM 4); -- 4
        POSITION ('C' IN 'ABCABCABCABCABC' REPEAT 4); -- 12
        POSITION ('AB' IN 'ABCABCABCABCABC' FROM 2 REPEAT 3); -- 10
        POSITION ('A' IN 'ABCABCABCABCABC' REPEAT -2); -- 10
        POSITION ('BC' IN 'ABCABCABCABCABC' FROM 12 REPEAT -3); -- 5

      3. SUBSTRING
        여러가지 매개변수 옵션을 지정하여 원하는 문자열을 추출하기 위한 함수.
        - FROM 시작위치 : 문자열 시작 위치 (기본은 1)
        - BEFORE 문자열 : FOR 가 없는 경우 시작부터 지정한 문자열의 첫 번째 발생 전까지, FOR 가 있는 경우 첫번째 발생지점 앞 N개의 문자열 리턴.
        - AFTER 문자열 : 지정한 문자열 다음 문자부터 FOR가 있는 경우 해당 길이 만큼, 아니면 문자열의 맨 마지막까지의 문자열 리턴.
        - FOR 문자열길이 : 추출할 문자열의 길이
        SUBSTRING('Hello World!' FROM 7 FOR 4);  -- 'Worl'
        SUBSTRING('Hello World!' BEFORE 'World');  -- 'Hello '
        SUBSTRING('Hello World!' BEFORE 'World' FOR 3);  -- 'lo '
        SUBSTRING('Hello World!' BEFORE 'e');  -- 'H'
        SUBSTRING('Hello World!' AFTER 'World');  -- '!'
        SUBSTRING('Hello World!' AFTER 'W' FOR 2);  -- 'or'
        SUBSTRING('Hello World!' AFTER 'P');  -- ''

      4. TRIM
        문자열에서 후미 및 선두의 개개의 문자를 제거하는 문자열 조작 함수. 기본적으로는 지정한 문자열을 소스문자열에서 모두 제거한다.
        - BOTH : 양끝
        - LEADING : 왼쪽
        - TRAILING : 오른쪽
        TRIM(TRAILING 'b' FROM 'aaabBb'); -- 'aaabB'
        TRIM('  a  '); -- 'a'
        TRIM(LEADING FROM '  a  '); -- 'a '
        TRIM('b' FROM 'bbbaaabbb'); -- 'aaa'
        TRIM( 'ste' FROM 'testmgktest'); -- 'mgk'

     

    참조 ) https://www.ibm.com/support/knowledgecenter/ko/SSMKHH_10.0.0/com.ibm.etools.mft.doc/ak04900_.htm

     

    IBM Knowledge Center

    Please note that DISQUS operates this forum. When you sign in to comment, IBM will provide your email, first name and last name to DISQUS. That information, along with your comments, will be governed by DISQUS’ privacy policy. By commenting, you are acce

    www.ibm.com

     

    반응형

    'ETC.' 카테고리의 다른 글

    WebtoB & Jeus 버전 확인 명령어  (0) 2020.07.17
    유니코드 Encoding/Decoding  (0) 2020.05.27
    [IBM] ESQL(Extended Structured Query Language) 개요  (0) 2020.05.21
    [IBM] IBM Integration Bus 개요  (0) 2020.05.21

    댓글

Customed By Hailey Gong.