ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Oracle CONNECT BY LEVEL → AMDP SERIES_GENERATE_INTEGER 변환
    SAP 2026. 6. 9. 18:21

    oracle-connect-by-to-amdp.html
    0.01MB

     

     

    Oracle CONNECT BY LEVEL → AMDP SERIES_GENERATE_INTEGER 변환

    Oracle CONNECT BY LEVEL → AMDP SERIES_GENERATE_INTEGER 변환

    1. 기본 변환 패턴

    Oracle에서 순번을 생성할 때 자주 쓰는 CONNECT BY LEVEL 패턴은 HANA SQLScript에서 SERIES_GENERATE_INTEGER로 대체한다.

    Oracle
    SELECT LEVEL AS num
      FROM DUAL
     CONNECT BY LEVEL < 10
    AMDP SQLScript
    RETURN
      SELECT GENERATED_PERIOD_START AS num
        FROM SERIES_GENERATE_INTEGER(1, 1, 9);

    함수 인자 구조

    SERIES_GENERATE_INTEGER( increment, start, end )
    --                            ↑        ↑      ↑
    --                           간격     시작   끝값(포함)
    OracleAMDP SQLScript설명
    FROM DUAL제거HANA에서 DUAL 불필요
    CONNECT BY LEVEL < 10SERIES_GENERATE_INTEGER(1, 1, 9)< 10 이므로 끝값은 9
    LEVEL <= 10SERIES_GENERATE_INTEGER(1, 1, 10)<= 이면 끝값 그대로
    LEVEL (컬럼)GENERATED_PERIOD_START생성된 정수값 컬럼명
    💡 GENERATED_PERIOD_START 외에도 GENERATED_PERIOD_END 컬럼이 함께 생성된다. 보통 GENERATED_PERIOD_START만 사용하면 된다.

    2. 서브쿼리(인라인 뷰) 활용

    서브쿼리 안에서도 동일하게 사용 가능하다.

    RETURN
      SELECT t.num,
             t.num * t.num AS square
        FROM ( SELECT GENERATED_PERIOD_START AS num
                 FROM SERIES_GENERATE_INTEGER(1, 1, 9) ) AS t
       WHERE t.num > 5;
    💡 서브쿼리로 감싸서 별칭(AS t)을 부여하면 이후 WHERE, JOIN 등에서 자유롭게 참조 가능하다.

    3. CTE(WITH절) 활용 — 권장

    서브쿼리보다 가독성이 좋고 재사용이 쉬운 WITH절 방식을 권장한다.

    RETURN
      WITH nums AS (
        SELECT GENERATED_PERIOD_START AS num
          FROM SERIES_GENERATE_INTEGER(1, 1, 9)
      )
      SELECT num,
             num * num AS square
        FROM nums
       WHERE num > 5;

    4. 실무 활용 패턴

    4-1. 날짜 시퀀스 생성 (달력 JOIN)

    -- 오늘부터 30일치 날짜 목록 생성
    RETURN
      WITH date_series AS (
        SELECT ADD_DAYS(CURRENT_DATE, GENERATED_PERIOD_START - 1) AS cal_date
          FROM SERIES_GENERATE_INTEGER(1, 1, 30)
      )
      SELECT d.cal_date,
             COALESCE(s.sales_amt, 0) AS sales_amt
        FROM date_series AS d
        LEFT OUTER JOIN daily_sales AS s
          ON d.cal_date = s.sales_date
             AND s.mandt = SESSION_CONTEXT('CLIENT')
       ORDER BY d.cal_date;

    4-2. 다른 테이블과 JOIN (행 번호 매기기)

    -- 조회 결과에 순번 부여 (ROW_NUMBER 대안)
    RETURN
      WITH base AS (
        SELECT vbeln, kunnr, netwr
          FROM vbak
         WHERE mandt = SESSION_CONTEXT('CLIENT')
         ORDER BY erdat DESC
      ),
      nums AS (
        SELECT GENERATED_PERIOD_START AS rn
          FROM SERIES_GENERATE_INTEGER(1, 1, 100)
      )
      SELECT n.rn, b.vbeln, b.kunnr, b.netwr
        FROM base AS b
        JOIN nums AS n
          ON n.rn = ROW_NUMBER() OVER (ORDER BY b.netwr DESC);
    ⚠️ 끝값 주의
    LEVEL < 10 → end = 9 (끝값 미만)
    LEVEL <= 10 → end = 10 (끝값 이하)
    Oracle 조건을 그대로 옮길 때 < / <= 구분을 반드시 확인한다.

    5. 변환 요약

    Oracle 패턴AMDP 변환비고
    FROM DUAL CONNECT BY LEVEL < N FROM SERIES_GENERATE_INTEGER(1, 1, N-1) 끝값 = N-1
    FROM DUAL CONNECT BY LEVEL <= N FROM SERIES_GENERATE_INTEGER(1, 1, N) 끝값 = N
    인라인 뷰(서브쿼리) 서브쿼리 그대로 사용 가능 별칭 필수
    WITH절(CTE) 방식 권장 가독성 ↑, 재사용 ↑
    LEVEL 컬럼 GENERATED_PERIOD_START 정수값 컬럼명
    #AMDP #SQLScript #SERIES_GENERATE_INTEGER #CONNECT_BY #Oracle_to_HANA #SAP_HANA #S4HANA
Designed by Tistory.