-
HANA Sequence & NEXTVAL — Oracle → AMDP 변환 정리SAP 2026. 6. 18. 20:54hana_sequence_amdp.html0.03MBhana_sequence_amdp.pdf0.16MB
HANA Sequence & NEXTVAL — Oracle → AMDP 변환 정리 HANA Sequence & NEXTVAL — Oracle → AMDP 변환 정리
1. Oracle NEXTVAL → HANA SQLScript 변환 기본
Oracle의
SEQ.NEXTVAL은 HANA에서도 시퀀스 오브젝트를 지원하지만, AMDP 컨테이너 종류에 따라 사용 가능 여부가 달라진다.구분 Oracle HANA SQLScript 다음 값 SEQ.NEXTVAL"SCHEMA"."SEQ".NEXTVAL현재 값 SEQ.CURRVAL"SCHEMA"."SEQ".CURRVAL단순 SELECT FROM DUALFROM DUMMY⚠️ HANA에서는 스키마명 + 큰따옴표가 기본 문법이다. 단, default schema에 시퀀스가 있으면 스키마 생략 가능.2. AMDP 컨테이너별 NEXTVAL 사용 가능 여부
핵심은
OPTIONS READ-ONLY여부가 아니라 컨테이너 종류 자체다.AMDP 타입 ABAP 선언 NEXTVAL 이유 PROCEDURE (non-read-only) BY DATABASE PROCEDURE✅ 가능 DML/side-effect 허용 PROCEDURE (read-only) BY DATABASE PROCEDURE OPTIONS READ-ONLY❌ 불가 read-only 제약 TABLE FUNCTION BY DATABASE FUNCTION❌ 불가 구조적 side-effect 금지 SCALAR FUNCTION BY DATABASE FUNCTION+ scalar return❌ 불가 동일, side-effect 금지 💡 TABLE FUNCTION은OPTIONS READ-ONLY를 명시하지 않아도 HANA SQLScript 스펙상 side-effect-free가 강제된다. NEXTVAL 사용 = BY DATABASE PROCEDURE (OPTIONS READ-ONLY 없을 때)만.3. NEXTVAL 사용 문법 패턴
패턴 A — 스칼라 변수에 담기 (가장 일반적)
METHOD generate_doc BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT USING zmy_table. " OPTIONS READ-ONLY 없어야 함 DECLARE lv_new_id BIGINT; " ① NEXTVAL → 스칼라 변수로 SELECT INTO SELECT "ZMY_SEQ".NEXTVAL " 스키마 생략 (default schema) INTO lv_new_id FROM DUMMY; " ② 채번된 값으로 INSERT INSERT INTO zmy_table (mandt, doc_id, bukrs, bldat) VALUES ( SESSION_CONTEXT('CLIENT'), :lv_new_id, :iv_bukrs, CURRENT_DATE ); ev_doc_id := :lv_new_id; ENDMETHOD.패턴 B — INSERT ... SELECT 인라인 직접 삽입
METHOD copy_and_renumber BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT USING zsrc_table zdst_table. " SELECT 컬럼 목록 안에서 NEXTVAL 직접 사용 " → 행마다 개별 채번 (3행 INSERT = 시퀀스 3번 증가) INSERT INTO zdst_table (mandt, new_id, matnr, werks) SELECT SESSION_CONTEXT('CLIENT'), "ZMY_SEQ".NEXTVAL, matnr, werks FROM zsrc_table WHERE mandt = SESSION_CONTEXT('CLIENT') AND bukrs = :iv_bukrs; ENDMETHOD.패턴 C — CURRVAL로 직전 채번값 재사용
METHOD create_header_and_item BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT USING zheader_t zitem_t. DECLARE lv_hdr_id BIGINT; SELECT "ZMY_SEQ".NEXTVAL INTO lv_hdr_id FROM DUMMY; INSERT INTO zheader_t (mandt, hdr_id, kunnr, erdat) VALUES (SESSION_CONTEXT('CLIENT'), :lv_hdr_id, :iv_kunnr, CURRENT_DATE); " 같은 세션 → CURRVAL로 헤더 ID 재참조 INSERT INTO zitem_t (mandt, hdr_id, item_no, matnr) VALUES (SESSION_CONTEXT('CLIENT'), "ZMY_SEQ".CURRVAL, " 직전 NEXTVAL 값 '0010', :iv_matnr); ENDMETHOD.⚠️ CURRVAL은 같은 세션에서 NEXTVAL을 한 번 이상 호출한 이후에만 유효하다.4. 스키마 지정 여부
스키마를 명시하지 않으면 default schema가 자동 적용된다. S/4HANA AMDP의 default schema는 ABAP 시스템 DB 스키마(
SAPSR3등)이다.상황 결과 시퀀스가 default schema에 있음 ✅ 스키마 생략 가능 시퀀스가 다른 schema에 있음 ❌ 반드시 스키마 명시 DEV→QAS→PRD 스키마명이 다름 ⚠️ 하드코딩 시 이관 후 오류 -- ✅ 권장: 스키마 생략 (이관 안전) SELECT "ZMY_SEQ".NEXTVAL INTO lv_id FROM DUMMY; -- ⚠️ 주의: 스키마 하드코딩 (DEV에서만 동작할 수 있음) SELECT "SAPSR3"."ZMY_SEQ".NEXTVAL INTO lv_id FROM DUMMY;5. Default Schema 확인 방법
방법 용도 DB_DBSCHEMA_CURRENT(ABAP FM)ABAP 프로그램에서 확인 SELECT CURRENT_SCHEMA FROM DUMMYSQL Console / AMDP 내부 SEQUENCES시스템 뷰시퀀스 목록 + 현재값 동시 확인 DBACOCKPIT SQL Editor 트랜잭션에서 빠르게 확인 " ABAP에서 default schema 확인 DATA lv_schema TYPE dbschema. CALL FUNCTION 'DB_DBSCHEMA_CURRENT' IMPORTING dbschema = lv_schema. WRITE lv_schema.-- 시퀀스 목록 + 현재값 조회 SELECT SCHEMA_NAME, SEQUENCE_NAME, START_NUMBER, INCREMENT_BY, CURRENT_VALUE FROM SEQUENCES WHERE SCHEMA_NAME = CURRENT_SCHEMA ORDER BY SEQUENCE_NAME;6. 시퀀스 생성 방법
-- 기본 생성 (HANA SQL Console / DBACOCKPIT) CREATE SEQUENCE "ZMY_SEQ" START WITH 1 INCREMENT BY 1 NO MAXVALUE NO CYCLE CACHE 20;옵션 정리
옵션 설명 기본값 START WITH n시작값 MINVALUE INCREMENT BY n증가폭 (음수=감소) 1 MAXVALUE n / NO MAXVALUE최댓값 4611686018427387903 CYCLE / NO CYCLE최대 도달 후 순환 여부 NO CYCLE CACHE n / NO CACHE성능용 선점 캐시 수 20 RESET BY subqueryDB 재시작 시 초기화 기준 없음 (마지막값 유지) ⚠️ SQL Console로 직접 생성한 시퀀스는 트랜스포트 불가. DEV/QAS/PRD 각 시스템에서 수동 실행 필요.7. SAP Number Range vs HANA Sequence
항목 SAP Number Range (SNRO) HANA Sequence 관리 위치 ABAP 레이어 (딕셔너리 오브젝트) HANA DB 레이어 트랜스포트 ✅ 가능 (정의만, 번호값 제외) ❌ 불가 (수동 생성) 채번 위치 ABAP 서버 HANA DB 내부 알파숫자 번호 ✅ 가능 (예: Z000001) ❌ 숫자만 회사/연도별 분리 ✅ 가능 (Sub-object) ❌ 없음 외부번호 지정 ✅ 가능 ❌ 없음 SAP 표준 통합 ✅ FI/MM/SD 등 연동 ❌ SAP 표준과 무관 AMDP 직접 사용 ❌ ABAP 레이어 필요 ✅ PROCEDURE에서 직접 대량 INSERT 성능 ⚠️ ABAP 서버 왕복 발생 ✅ DB 내부 처리, 빠름 Gap 발생 ⚠️ 롤백 시 번호 소멸 ⚠️ 동일 (더 심할 수 있음) 용도 가이드
상황 권장 SAP 표준 문서번호 (전표, 발주서 등) Number Range (SNRO) 알파숫자 번호, 연도/회사코드별 분리 Number Range AMDP 내부 대량 INSERT, DB pushdown 완결 HANA Sequence SAP 표준과 무관한 순수 숫자 키, 성능 우선 HANA Sequence 💡 S/4HANA 표준 개발에서는 Number Range가 정석. HANA Sequence는 AMDP 내부 완결 고성능 처리 또는 순수 커스텀 오브젝트에 적합.8. AMDP Class에서 NEXTVAL 접근 방법별 실패 원인
AMDP PROCEDURE 내에서 시퀀스를 직접 참조하면 AMDP 파서(컴파일 시점)가 오류를 낸다. DB02 SQL Editor에서는 동작하지만 AMDP에서만 실패하는 이유가 여기에 있다.
방법 결과 원인 "SCHEMA"."SEQ".NEXTVAL❌ 실패 AMDP가 ABAP default schema 명시 금지 "SEQ".NEXTVAL❌ 실패 AMDP 파서가 DDIC 오브젝트로 해석 SEQ.NEXTVAL❌ 실패 동일, DDIC 오브젝트 탐색 시도 EXECUTE IMMEDIATE✅ 성공 AMDP 파서 우회, 런타임에 HANA 직접 실행 SYNONYM 사용 ✅ 성공 DDIC 오브젝트가 아니므로 파서 통과 ❌ 실패 원인 1 — 스키마 명시 (
"SAPSR3"."SEQ".NEXTVAL)AMDP는 컴파일 시점에 SQL을 파싱하면서 ABAP 레이어와 HANA DB 레이어를 동시에 검증한다. default schema(
SAPSR3등)는 ABAP이 독점 관리하는 영역으로 간주하기 때문에, 개발자가 직접 스키마를 명시하면 오류를 낸다.⚠️ 오류:the abap database schema "SAPSR3" cannot be specified explicitly for the object "SEQ"❌ 실패 원인 2 — 스키마 생략 (
"SEQ".NEXTVAL)AMDP 파서는 큰따옴표 단일 식별자
"SEQ"를 보면 SE11(ABAP Dictionary)에서 먼저 찾는다. 시퀀스는 HANA DB 오브젝트이지 DDIC 오브젝트가 아니므로 찾지 못한다.⚠️ 오류:"SEQ" is unknown. ABAP objects and DDIC objects must be declared in the USING clause. Local names must start with ":" here✅ 성공 원인 — EXECUTE IMMEDIATE
AMDP 파서 입장에서 SQL 문자열은 그냥 문자열 변수이므로 내용을 검증하지 않는다. 런타임에 HANA가 직접 받아서 실행하기 때문에 스키마 제약도 없다.
9. EXECUTE IMMEDIATE 사용 시 주의사항
① TABLE FUNCTION에서 사용 불가
" ❌ TABLE FUNCTION — EXECUTE IMMEDIATE 불가 METHOD get_data BY DATABASE FUNCTION FOR HDB LANGUAGE SQLSCRIPT OPTIONS READ-ONLY. " EXECUTE IMMEDIATE 사용 시 활성화 오류 발생 " ✅ PROCEDURE에서만 가능 METHOD nextval BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT. DECLARE lv_id BIGINT; DECLARE lv_sql NVARCHAR(200); lv_sql := 'SELECT "SEQ".NEXTVAL FROM DUMMY'; EXECUTE IMMEDIATE lv_sql INTO lv_id; ev_val := LPAD(TO_NVARCHAR(:lv_id), 10, '0'); ENDMETHOD.② SQL Injection 주의
동적 SQL이므로 외부 입력값을 문자열에 직접 연결하면 위험하다. 시퀀스명처럼 고정값만 사용하는 것이 안전하다.
" ❌ 위험 — 외부 입력 직접 연결 lv_sql := 'SELECT * FROM ' || :iv_table_name || ' WHERE ...'; " ✅ 안전 — 시퀀스명처럼 고정값만 사용 lv_sql := 'SELECT "SEQ".NEXTVAL FROM DUMMY';③ 성능 — 실행계획 캐시 미활용
정적 SQL은 실행계획이 캐시되지만
EXECUTE IMMEDIATE는 매 호출마다 파싱한다. 단순 NEXTVAL 조회는 영향이 미미하지만, 복잡한 쿼리에 사용 시 성능 저하 가능.④ 디버깅 어려움 — 오탈자가 런타임에야 발견됨
컴파일 시점 문법 검증이 없으므로 오탈자가 있어도 활성화는 된다. 런타임에서야 오류 발생.
" 활성화는 되지만 런타임 오류 발생 lv_sql := 'SELECT "SEQ".NEXVAL FROM DUMMY'; " ↑ NEXTVAL 오탈자 → 실행 시점에야 오류⑤ USING 절 불필요 (시퀀스 한정)
시퀀스는 DDIC 오브젝트가 아니므로 USING 절 선언이 불필요하다. 단, 테이블을 함께 사용하면 해당 테이블은 반드시 USING 절에 선언해야 한다.
METHOD nextval BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT. " ✅ 시퀀스만 사용 시 USING 절 생략 가능 " ⚠️ 테이블 접근 시엔 반드시 USING 절 선언 필요 " 예: USING zmy_table주의사항 요약
항목 내용 사용 가능 컨테이너 BY DATABASE PROCEDURE만 가능. TABLE FUNCTION 불가SQL Injection 고정 문자열만 사용. 외부 입력 직접 연결 금지 성능 매 호출마다 파싱. 단순 NEXTVAL은 영향 미미 디버깅 오탈자가 활성화 시점에 검출되지 않음. 런타임 오류 USING 절 시퀀스는 선언 불필요. 테이블은 반드시 선언 타입 변환 NEXTVAL은 BIGINT 반환 → CHAR 변환 시 LPAD(TO_NVARCHAR(:lv_id), 10, '0')필요'SAP' 카테고리의 다른 글
AMDP 예외 처리 정리: SIGNAL, EXIT HANDLER, CX_AMDP_EXECUTION_ERROR (0) 2026.07.02 AMDP OPTIONS CDS SESSION CLIENT CURRENT - MANDT 처리 정리 (0) 2026.06.23 AMDP 동적 JSON 파라미터 (0) 2026.06.17 ABAP 타입풀 상수명 추출 (0) 2026.06.12 oracle to amdp : generator (HTML version) (0) 2026.06.10