ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SAP HANA SQLScript - Built-in Libraries (12.2 ~ 12.3)
    SAP 2026. 5. 30. 21:18

    sqlscript_ch12_2to12_3.html
    0.03MB

     

     

    SAP HANA SQLScript - Built-in Libraries (12.2 ~ 12.3)

    📘 SAP HANA SQLScript Reference
    Chapter 12 — Built-in Libraries (12.2 ~ 12.3)

    SAP HANA SQLScript Reference for SAP HANA Platform | pp. 249~256 정리

    1. 12.2 Built-in Library SQLSCRIPT_STRING

    SQLSCRIPT_STRING 라이브러리는 문자열 조작을 쉽고 편리하게 할 수 있는 내장 라이브러리다. 구분자 또는 정규식으로 문자열을 분리(split)하거나, 문자열을 포맷(format)하거나, 테이블 변수를 문자열로 변환하는 기능을 제공한다.

    라이브러리 인터페이스 전체 구조

    CREATE LIBRARY SYS.SQLSCRIPT_STRING LANGUAGE SQLSCRIPT AS BUILTIN BEGIN -- SPLIT 계열 FUNCTION SPLIT(IN VALUE NVARCHAR(5000), IN SEPARATOR NVARCHAR(5000), IN MAXSPLIT INT DEFAULT -1) RETURNS ...; FUNCTION SPLIT_TO_TABLE(IN VALUE NVARCHAR(5000), IN SEPARATOR NVARCHAR(5000), IN MAXSPLIT INT DEFAULT -1) RETURNS TABLE(RESULT NVARCHAR(5000)); FUNCTION SPLIT_TO_ARRAY(IN VALUE NVARCHAR(5000), IN SEPARATOR NVARCHAR(5000), IN MAXSPLIT INT DEFAULT -1) RETURNS RESULTS NVARCHAR(5000) ARRAY; FUNCTION SPLIT_REGEXPR(IN VALUE NVARCHAR(5000), IN REGEXPR NVARCHAR(5000), IN MAXSPLIT INT DEFAULT -1) RETURNS ...; FUNCTION SPLIT_REGEXPR_TO_TABLE(IN VALUE NVARCHAR(5000), IN REGEXPR NVARCHAR(5000), IN MAXSPLIT INT DEFAULT -1) RETURNS TABLE(RESULT NVARCHAR(5000)); FUNCTION SPLIT_REGEXPR_TO_ARRAY(IN VALUE NVARCHAR(5000), IN REGEXPR NVARCHAR(5000), IN MAXSPLIT INT DEFAULT -1) RETURNS RESULTS NVARCHAR(5000) ARRAY; -- FORMAT 계열 FUNCTION FORMAT(IN FORMAT NVARCHAR(5000), IN ...) RETURNS RESULT NVARCHAR(8388607); FUNCTION FORMAT_TO_TABLE(IN FORMAT NVARCHAR(5000), IN TABLE(...)) RETURNS TABLE(RESULT NVARCHAR(8388607)); FUNCTION FORMAT_TO_ARRAY(IN FORMAT NVARCHAR(5000), IN TABLE(...)) RETURNS RESULTS NVARCHAR(8388607) ARRAY; -- TABLE_SUMMARY FUNCTION TABLE_SUMMARY(IN TABLE TABLE(...), IN ROWS INT DEFAULT 100) RETURNS RESULT NVARCHAR(8388607); END;
    💡 사용 방법 프로시저/함수 내에서 USING SQLSCRIPT_STRING AS LIB; 로 선언한 뒤 LIB:함수명() 형태로 호출한다.

    1-1. SPLIT Family Functions

    SPLIT 계열 함수는 구분자(delimiter) 또는 정규식(regular expression)으로 문자열을 분리한다. 반환 형태에 따라 세 가지 변형이 있다.

    함수명반환 타입구분자 방식
    SPLIT다중 스칼라 변수일반 구분자
    SPLIT_REGEXPR다중 스칼라 변수정규식
    SPLIT_TO_ARRAYNVARCHAR(5000) ARRAY일반 구분자
    SPLIT_REGEXPR_TO_ARRAYNVARCHAR(5000) ARRAY정규식
    SPLIT_TO_TABLETABLE(RESULT NVARCHAR(5000))일반 구분자
    SPLIT_REGEXPR_TO_TABLETABLE(RESULT NVARCHAR(5000))정규식

    ▸ SPLIT / SPLIT_REGEXPR — 다중 변수 반환

    • MAXSPLIT = -1이면 분리 횟수 제한 없음
    • MAXSPLIT을 지정하면 최대 MAXSPLIT 회까지만 분리
    • 빈 문자열 입력 → 빈 문자열 반환
    • 구분자 없는 문자열 → 전체 문자열을 그대로 반환
    • N-1개 구분자 입력 → N개의 분리된 문자열 반환

    ▸ SPLIT_TO_ARRAY / SPLIT_REGEXPR_TO_ARRAY — 배열 반환

    • 빈 문자열 입력 → null 값들의 배열 반환
    • 구분자 없는 문자열 → 첫 번째 원소에 전체 문자열이 담긴 배열 반환
    • N-1개 구분자 입력 → N개 원소 배열 반환

    ▸ SPLIT_TO_TABLE / SPLIT_REGEXPR_TO_TABLE — 테이블 반환

    단일 컬럼 테이블 타입 TABLE(RESULT NVARCHAR(5000))을 반환한다.

    • 빈 문자열 입력 → 0행 테이블 반환
    • 구분자 없는 문자열 → 1행(전체 문자열) 테이블 반환
    • N-1개 구분자 입력 → N행 테이블 반환
    • UNNEST(SPLIT_TO_ARRAY(val, sep)) AS ("WORD")와 동일하게 해석 가능
    ⚠️ 주의 — SPLIT_TO_TABLE 암묵적 테이블 변수 선언 불가 SPLIT_TO_TABLE은 암묵적(implicit) 테이블 변수 선언을 지원하지 않는다. 반드시 명시적으로 테이블 변수를 선언해야 한다.
    -- ❌ 잘못된 예 (암묵적 선언 - 오류 발생)
    tv = LIB:SPLIT_TO_TABLE('a,b', ',');
    
    -- ✅ 올바른 예 (명시적 선언)
    DECLARE tv TABLE(RESULT NVARCHAR(5000));
    tv = LIB:SPLIT_TO_TABLE('a,b', ',');

    SPLIT 계열 전체 예제

    DO BEGIN
        USING SQLSCRIPT_STRING AS LIB;
    
        -- 기본 SPLIT: 3개 변수로 분리
        DECLARE a1, a2, a3 INT;
        (a1, a2, a3) = LIB:SPLIT('10, 20, 30', ', ');  -- (10, 20, 30)
    
        -- 공백으로 분리
        DECLARE first_name, last_name STRING;
        first_name = LIB:SPLIT('John Sutherland', ' ');        -- 'John Sutherland' (구분자 없음)
        (first_name, last_name) = LIB:SPLIT('John Sutherland', ' ');  -- ('John', 'Sutherland')
    
        -- MAXSPLIT 지정: 최대 1회만 분리
        (first_name, last_name) = LIB:SPLIT('Michael Forsyth Jr', ' ', 1); -- ('Michael', 'Forsyth Jr')
    
        -- 정규식으로 분리 (전화번호)
        DECLARE area_code, first_num, last_num INT;
        (area_code, first_num, last_num) = LIB:SPLIT_REGEXPR('(02)2143-5300', '\(|\)|-');
        -- (02, 2143, 5300)
    END;
    
    DO BEGIN
        USING SQLSCRIPT_STRING AS LIB;
    
        -- SPLIT_TO_ARRAY
        DECLARE arr INT ARRAY;
        arr = LIB:SPLIT_TO_ARRAY('10,20,30,40,50', ',');
        -- array(10, 20, 30, 40, 50)
    
        -- SPLIT_REGEXPR_TO_ARRAY (정규식 구분자)
        DECLARE arr2 STRING ARRAY;
        arr2 = LIB:SPLIT_REGEXPR_TO_ARRAY('Blake Kelly; Fred Randall; Bell Walsh; Leonard Quinn; Chris McDonald', '\s*;\s*');
        -- array('Blake Kelly', 'Fred Randall', 'Bell Walsh', 'Leonard Quinn', 'Chris McDonald')
    
        -- SPLIT_TO_TABLE
        DECLARE tv TABLE(RESULT NVARCHAR(5000));
        tv = LIB:SPLIT_TO_TABLE('10,20,30,40,50', ',');
        -- table[(10),(20),(30),(40),(50)]
    
        -- SPLIT_REGEXPR_TO_TABLE (복합 연산자 구분자)
        DECLARE tv2 TABLE(RESULT NVARCHAR(5000));
        tv2 = LIB:SPLIT_REGEXPR_TO_TABLE('10+20/30*40-50', '\+|\/|\*|-');
        -- table[(10),(20),(30),(40),(50)]
    END;

    1-2. FORMAT Family Functions

    Python 스타일의 포맷 문자열을 사용해 문자열을 생성한다. {}, {0}, {field_name}, {:format_spec} 형식을 지원한다.

    ▸ FORMAT 문자열 문법 (Python-style)

    replacement_field ::= "{" [field_name] [":" format_spec] "}" field_name ::= [column_name | integer] format_spec ::= [sign][0][width][.precision][type] sign ::= "+" | "-" | " " type ::= "s" | "b" | "c" | "d" | "o" | "x" | "X" | "e" | "E" | "f" | "F" | "g" | "G"

    타입 지정자 (Type Specifiers)

    분류타입설명
    문자열sString format
    (없음)'s'와 동일
    정수bBinary format (이진수)
    cCharacter (문자)
    dDecimal Integer (10진수) — 기본값
    oOctal format (8진수)
    xHEX format (소문자)
    XHEX format (대문자)
    (없음)'d'와 동일
    부동소수점/
    Decimal
    e지수 표기법 (기본 precision 6, 소문자 'e')
    E지수 표기법 (대문자 'E')
    f고정 소수점 (기본 precision 6)
    F고정 소수점, nan→NAN, inf→INF
    g일반 포맷 (기본 precision 6), -4 <= exp < p 이면 'f', 나머지 'e'
    G일반 포맷 (대문자 'E')
    (없음)'g'와 유사, precision은 숫자 표현에 필요한 최대

    FORMAT 예제

    분류호출 예시결과
    BasicFORMAT('{} {}', 'one', 'two')'one two'
    Basic (순서 지정)FORMAT('{1} {0}', 1, 2)'2 1'
    문자열 잘라내기FORMAT('{:.5}', 'xylophone')'xylop'
    너비+정렬FORMAT('{:10.5}', 'xylophone')'xylop '
    정수FORMAT('{:d}', 42)'42'
    고정소수점FORMAT('{:f}', 3.14159...)'3.141593'
    일반 포맷FORMAT('{:g}', 123456)'123456'
    일반 포맷(지수)FORMAT('{:g}', 1234567)'1.23456e+06'
    패딩(공백)FORMAT('{:4d}', 42)' 42'
    패딩(소수)FORMAT('{:06.2f}', 3.14159...)'003.14'
    패딩(0)FORMAT('{:04d}', 42)'0042'
    부호(+)FORMAT('{:+d}', 42)'+42'
    부호(-)FORMAT('{: d}', -23)'-23'
    컬럼명 참조FORMAT_TO_TABLE('{first}{last}', :tv)각 행에서 컬럼값으로 대체
    컬럼명+포맷FORMAT_TO_TABLE('{first:04d}{last:02d}', :tv)포맷 적용 후 대체

    ▸ FORMAT_TO_TABLE / FORMAT_TO_ARRAY

    테이블 변수를 입력받아 포맷 문자열을 행(row) 단위로 적용한 결과를 테이블 또는 배열로 반환한다. 필드명으로 컬럼명을 참조할 수 있다.

    DO BEGIN
        USING SQLSCRIPT_STRING AS LIB;
    
        -- FORMAT: 스칼라 변수로 포맷
        DECLARE your_name STRING = LIB:FORMAT('{} {}', 'John', 'Sutherland');
        -- 'John Sutherland'
    
        DECLARE name_age STRING = LIB:FORMAT('{1} {0}', 30, 'Sutherland');
        -- 'Sutherland 30'
    
        DECLARE pi_str STRING = LIB:FORMAT('PI: {:06.2f}', 3.141592653589793);
        -- 'PI: 003.14'
    
        -- 타임스탬프 포맷
        DECLARE ts STRING = LIB:FORMAT('Today is {}', TO_VARCHAR(current_timestamp, 'YYYY/MM/DD'));
        -- 'Today is 2017/10/18'
    
        -- 배열을 FORMAT에 사용
        DECLARE scores DOUBLE ARRAY = ARRAY(1.4, 2.1, 40.3);
        DECLARE score_str STRING = LIB:FORMAT('{}-{}-{}', :scores);
        -- '1.4-2.1-40.3'
    
        -- FORMAT_TO_ARRAY: 테이블 변수 행별 포맷
        DECLARE tt TABLE (first_name NVARCHAR(100), last_name NVARCHAR(100), birth_year INT);
        tt.first_name[1] = 'John';   tt.last_name[1] = 'Sutherland'; tt.birth_year[1] = 1988;
        tt.first_name[2] = 'Edward'; tt.last_name[2] = 'Stark';      tt.birth_year[2] = 1960;
    
        DECLARE arr NVARCHAR(5000) ARRAY;
        arr = LIB:FORMAT_TO_ARRAY('{first_name} {last_name} was born in {birth_year}', :tt);
        -- ['John Sutherland was born in 1988', 'Edward Stark was born in 1960']
    
        -- FORMAT_TO_TABLE: 테이블로 반환
        DECLARE tv TABLE(RESULT NVARCHAR(5000));
        tv = LIB:FORMAT_TO_TABLE('{first_name} {last_name} was born in {birth_year}', :tt);
        -- tv: [('John Sutherland was born in 1988'), ('Edward Stark was born in 1960')]
    END;

    ▸ TABLE_SUMMARY

    테이블 변수를 클라이언트 친화적인 형식의 단일 문자열로 직렬화(serialize)한다. PROCEDURE 실행 중에 결과를 가져오며, 클라이언트 fetch 시점이 아닌 서버 실행 시점에 직렬화된다. MAX_RECORDS 파라미터로 직렬화 행 수를 제한할 수 있다. 결과가 NVARCHAR(8388607)을 초과하면 잘라서 반환한다.

    TABLE_SUMMARY 컬럼 타입별 포맷 규칙

    컬럼 타입적용 FORMAT 문자열
    Integer types"d" — 정수형
    String types"s" — 문자열형
    LOB types".32s" — 최대 32자
    Float types".2f" — 소수점 2자리
    Fixed types"" — 원래 precision + scale 유지
    CREATE TABLE SAMPLE1(NAME nvarchar(32), AGE INT);
    INSERT INTO SAMPLE1 VALUES ('John Bailey', 28);
    INSERT INTO SAMPLE1 VALUES ('Kevin Lawrence', 56);
    INSERT INTO SAMPLE1 VALUES ('Leonard Poole', 31);
    INSERT INTO SAMPLE1 VALUES ('Vanessa Avery', 16);
    
    DO BEGIN
        USING SQLSCRIPT_STRING AS STRING;
        USING SQLSCRIPT_PRINT AS PRINT;
    
        T1 = SELECT * FROM SAMPLE1;
        PRINT:PRINT_LINE(STRING:TABLE_SUMMARY(:T1, 3));  -- 최대 3행만 직렬화
    END;
    -- 출력:
    -- NAME,AGE
    -- John Bailey,28
    -- Kevin Lawrence,56
    -- Leonard Poole,31

    2. 12.3 Built-in Library SQLSCRIPT_PRINT

    SQLSCRIPT_PRINT 라이브러리는 문자열 또는 테이블 전체를 출력(print)할 수 있게 해준다. STRING 라이브러리와 함께 사용할 때 특히 유용하며, 디버깅이나 로그 목적으로 활용된다.
    ℹ️ Note SQLSCRIPT_PRINT 내장 라이브러리는 SAP HANA HDBSQL에서만 지원된다.

    라이브러리 인터페이스

    CREATE LIBRARY SYS.SQLSCRIPT_PRINT LANGUAGE SQLSCRIPT AS BUILTIN BEGIN PROCEDURE PRINT_LINE(IN VALUE NVARCHAR(8388607)); PROCEDURE PRINT_TABLE(IN TAB TABLE(...), IN MAX_RECORDS INT DEFAULT 100); END;

    동작 원리

    • PRINT 라이브러리 프로시저는 파라미터로부터 서버 사이드 결과를 생성해 내부 버퍼에 저장한다.
    • 저장된 문자열들은 PROCEDURE 실행 종료 후 클라이언트에 출력된다.
    • 중첩 실행(nested execution)의 경우, 가장 외부 CALL 종료 후에 클라이언트로 전달된다.
    • 기존 결과셋(result-set) 기반 결과와 PRINT 결과는 혼용되지 않는다.
    • PRINT 라이브러리 프로시저는 병렬(parallel) 실행 가능. 전체 PRINT 결과는 한 번에 flush되며, 출력 순서는 PROCEDURE body에서의 기술 순서를 따른다 (실행 순서와 무관).
    💡 STRING 라이브러리와 조합 문자열 포맷팅은 SQLSCRIPT_STRING의 FORMAT이나 TABLE_SUMMARY로 처리하고, 결과를 PRINT_LINE으로 출력하는 패턴이 가장 일반적이다.

    PRINT_LINE(VALUE)

    IN VALUE NVARCHAR(8388607) — 출력할 문자열

    하나의 문자열을 PRINT 결과로 반환하는 프로시저. NVARCHAR 값을 입력으로 받지만, 암묵적 변환이 가능한 대부분의 타입(INTEGER 등)도 사용 가능하다. 문자열 조작은 연결 연산자(||), TO_NVARCHAR(), 또는 SQLSCRIPT_STRING 라이브러리를 활용한다.

    PRINT_TABLE(TAB, MAX_RECORDS)

    IN TAB TABLE(...) — 출력할 테이블 변수

    IN MAX_RECORDS INT DEFAULT 100 — 출력할 최대 행 수

    테이블 변수를 단일 문자열로 파싱해 PRINT 결과로 반환하는 프로시저. 주로 SQLSCRIPT_STRING의 TABLE_SUMMARY와 함께 사용한다.

    SQLSCRIPT_PRINT 예제

    -- 예제 1: 기본 PRINT_LINE 사용
    DO BEGIN
        USING SQLSCRIPT_PRINT AS LIB;
        LIB:PRINT_LINE('HELLO WORLD');
        LIB:PRINT_LINE('LINE2');
        LIB:PRINT_LINE('LINE3');
    END;
    -- 출력: HELLO WORLD / LINE2 / LINE3
    -- 예제 2: STRING + PRINT 조합 (TABLE_SUMMARY → PRINT_LINE → PRINT_TABLE 활용)
    DO BEGIN
        USING SQLSCRIPT_PRINT AS LIB1;
        USING SQLSCRIPT_STRING AS LIB2;
    
        LIB1:PRINT_LINE('Hello World');
        LIB1:PRINT_LINE('Here is SAMPLE1');
    
        T1 = SELECT * FROM SAMPLE1;
        -- TABLE_SUMMARY로 직렬화된 문자열을 PRINT_LINE으로 출력
        LIB1:PRINT_LINE(LIB2:TABLE_SUMMARY(:T1));
    
        LIB1:PRINT_LINE('Here is SAMPLE2');
        T2 = SELECT * FROM SAMPLE2;
        -- PRINT_TABLE로 테이블 직접 출력 (최대 100행)
        LIB1:PRINT_TABLE(:T2);
    
        LIB1:PRINT_LINE('End of PRINT');
    END;
    ⚠️ TABLE_SUMMARY vs PRINT_TABLE 비교
    구분TABLE_SUMMARY (STRING)PRINT_TABLE (PRINT)
    반환 타입NVARCHAR(8388607) 단일 문자열PRINT 결과 (직접 출력)
    활용 방식결과를 변수에 저장 → PRINT_LINE으로 출력테이블 변수를 직접 출력
    직렬화 시점PROCEDURE 실행 중 (서버 사이드)PROCEDURE 실행 중 (서버 사이드)
    MAX_RECORDSTABLE_SUMMARY의 두 번째 파라미터PRINT_TABLE의 두 번째 파라미터
    주요 용도문자열 가공 후 출력, 포맷 조정 가능테이블을 바로 출력 (단순 확인용)
    #SAP_HANA #SQLScript #AMDP #BuiltinLibrary #SQLSCRIPT_STRING #SQLSCRIPT_PRINT #SPLIT #SPLIT_TO_ARRAY #SPLIT_TO_TABLE #SPLIT_REGEXPR #FORMAT #FORMAT_TO_TABLE #TABLE_SUMMARY #PRINT_LINE #PRINT_TABLE #StringManipulation
Designed by Tistory.