ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • HANA Sequence & NEXTVAL — Oracle → AMDP 변환 정리
    SAP 2026. 6. 18. 20:54

    hana_sequence_amdp.html
    0.03MB
    hana_sequence_amdp.pdf
    0.16MB

     

     

    HANA Sequence & NEXTVAL — Oracle → AMDP 변환 정리

    HANA Sequence & NEXTVAL — Oracle → AMDP 변환 정리

    SAP ABAP / AMDP · S/4HANA On-Premise · 2026.06

    1. Oracle NEXTVAL → HANA SQLScript 변환 기본

    Oracle의 SEQ.NEXTVAL은 HANA에서도 시퀀스 오브젝트를 지원하지만, AMDP 컨테이너 종류에 따라 사용 가능 여부가 달라진다.

    구분OracleHANA SQLScript
    다음 값SEQ.NEXTVAL"SCHEMA"."SEQ".NEXTVAL
    현재 값SEQ.CURRVAL"SCHEMA"."SEQ".CURRVAL
    단순 SELECTFROM 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 FUNCTIONBY DATABASE FUNCTION❌ 불가구조적 side-effect 금지
    SCALAR FUNCTIONBY 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가 직접 받아서 실행하기 때문에 스키마 제약도 없다.

    AMDP 파서와 EXECUTE IMMEDIATE 동작 비교 정적 SQL과 EXECUTE IMMEDIATE의 컴파일/런타임 처리 흐름 비교 다이어그램 컴파일 시점 (활성화) 런타임 (실행) AMDP METHOD 정적 SQL 포함 정적 SQL AMDP 파서 DDIC 오브젝트 검증 DDIC 탐색 "SEQ" 검색 → 없음 ❌ 활성화 오류 unknown object vs AMDP METHOD EXECUTE IMMEDIATE 동적 SQL AMDP 파서 문자열로 인식 검증 건너뜀 ✓ ✅ 활성화 완료 오류 없음 HANA DB 직접 실행 "SEQ".NEXTVAL 정상 인식 정적 SQL (실패 경로) EXECUTE IMMEDIATE (성공 경로)

    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_ABAP#AMDP#HANA_Sequence#NEXTVAL #S4HANA#SQLScript#NumberRange#Oracle_to_HANA #EXECUTE_IMMEDIATE#AMDP_파서
Designed by Tistory.