ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AMDP에서 WITH 구문(CTE) 활용하기
    SAP 2026. 5. 13. 18:29
    AMDP에서 WITH 구문(CTE) 활용하기

    AMDP에서 WITH 구문(CTE) 활용하기

    1. 핵심 결론

    AMDP에서 WITH 구문(CTE)을 사용할 수 있는가?

    네, WITH 구문은 AMDP에서 정상적으로 사용 가능합니다. 정적 SQLScript는 물론, 동적 SQL 형태에서도 동작합니다. 대부분의 경우 정적 WITH 한 줄이면 충분합니다.

    2. 정적 WITH (가장 일반적·권장)

    export 파라미터(et_result)에 결과를 바로 담을 수 있어 가장 깔끔한 패턴입니다.

    METHOD get_data BY DATABASE PROCEDURE FOR HDB
                    LANGUAGE SQLSCRIPT OPTIONS READ-ONLY
                    USING ztab.
    
      et_result = WITH cte AS (
                    SELECT bukrs, SUM(amount) AS amt
                      FROM ztab
                     WHERE mandt = :sy-mandt
                     GROUP BY bukrs
                  )
                  SELECT * FROM cte WHERE amt > 1000;
    ENDMETHOD.

    3. WHERE 조건만 동적인 경우 — APPLY_FILTER

    WITH 구문은 정적으로 두고 필터 조건만 문자열로 전달합니다. AMDP 제약 안에서 가장 안전하게 동적 WHERE를 구현하는 방법입니다.

    lt_base = WITH cte AS (
                SELECT bukrs, gjahr, SUM(amount) AS amt
                  FROM ztab
                 WHERE mandt = :sy-mandt
                 GROUP BY bukrs, gjahr
              )
              SELECT * FROM cte;
    
    et_result = APPLY_FILTER( :lt_base, :iv_filter );

    iv_filter 예시: 'bukrs = ''1000'' AND amt > 1000'

    4. 분기 패턴이 한정된 경우 — IF / CASE

    SELECT 컬럼이나 WHERE 구조 자체가 몇 가지 패턴으로 바뀌는 경우, 분기로 푸는 것이 안전합니다.

    IF :iv_mode = 'A' THEN
      et_result = WITH cte AS ( SELECT ... )
                  SELECT * FROM cte WHERE ...;
    ELSEIF :iv_mode = 'B' THEN
      et_result = WITH cte AS ( SELECT ... )
                  SELECT * FROM cte WHERE ...;
    END IF;

    5. 의사결정 가이드

    동적으로 바뀌어야 하는 것 권장 패턴
    없음 (모든 것이 정적) 정적 WITH
    WHERE 조건 값 APPLY_FILTER
    WHERE 구조나 SELECT 컬럼 IF / CASE 분기

    6. 정리

    • AMDP에서 WITH 구문(CTE)은 그대로 사용 가능
    • 정적 WITH → export 파라미터에 바로 할당 가능 (1순위)
    • WHERE만 동적 → APPLY_FILTER 활용
    • 패턴이 정해진 동적 → IF / CASE 분기
    💡 대부분의 경우 정적 WITH 한 줄이면 해결됩니다. 동적이 정말 필요한지 먼저 검토하세요.
    ⚠️ APPLY_FILTER 인자로 들어가는 문자열은 외부 입력을 그대로 받지 말고 화이트리스트 검증 후 사용해야 SQL Injection 위험을 피할 수 있습니다.
    #SAP #ABAP #AMDP #HANA #SQLScript #WITH #CTE #APPLY_FILTER
Designed by Tistory.