-
SAP HANA SQLScript - Built-in Libraries (12.2 ~ 12.3)SAP 2026. 5. 30. 21:18sqlscript_ch12_2to12_3.html0.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'와 동일 부동소수점/
Decimale지수 표기법 (기본 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 예제
분류 호출 예시 결과 Basic FORMAT('{} {}', '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,312. 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으로 출력하는 패턴이 가장 일반적이다.2-1. PRINT_LINE
PRINT_LINE(VALUE)
IN
VALUE NVARCHAR(8388607)— 출력할 문자열하나의 문자열을 PRINT 결과로 반환하는 프로시저. NVARCHAR 값을 입력으로 받지만, 암묵적 변환이 가능한 대부분의 타입(INTEGER 등)도 사용 가능하다. 문자열 조작은 연결 연산자(
||),TO_NVARCHAR(), 또는 SQLSCRIPT_STRING 라이브러리를 활용한다.2-2. PRINT_TABLE
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_RECORDS TABLE_SUMMARY의 두 번째 파라미터 PRINT_TABLE의 두 번째 파라미터 주요 용도 문자열 가공 후 출력, 포맷 조정 가능 테이블을 바로 출력 (단순 확인용) 'SAP' 카테고리의 다른 글
ABAP OPEN DATASET - itab 서버 파일 저장 (0) 2026.06.05 ABAP 정규식 빌더 (0) 2026.06.02 SAP HANA SQLScript - 8장 명령형 로직 (8.1~8.3) (0) 2026.05.30 SAP HANA SQL — 4.12 Error Codes (0) 2026.05.29 SAP HANA SQL - 4.5 Operators / 4.6 Expressions (0) 2026.05.29