본문 바로가기
카테고리 없음

ABAP New Syntax #16 - New Open SQL

by SAPortal 2024. 3. 9.

목차

    1. 주요특징

    • 향상된 선택문(Select Statements): 조인, 서브쿼리, 복잡한 조건, 집계 함수 등 SQL의 고급 기능을 ABAP에서 직접 사용할 수 있습니다.
    • 표현식과 함수의 지원: 문자열 함수, 수학 함수, 날짜 및 시간 함수 등 다양한 내장 함수를 쿼리 내에서 사용할 수 있으며, 이를 통해 데이터 처리가 더 유연해집니다.
    • 개선된 조인 기능: 내부 조인(Inner Join), 외부 조인(Left Outer Join) 등을 포함하여 다양한 종류의 SQL 조인을 지원합니다. 이를 통해 복잡한 데이터 관계를 쉽게 쿼리할 수 있습니다.
    • 인라인 선언을 통한 효율적인 데이터 처리: New Open SQL 결과를 처리하기 위해 인라인으로 데이터 정의를 선언할 수 있으며, 이는 코드를 더 간결하고 읽기 쉽게 만듭니다.
    • 향상된 통합: CDS(Views)와 같은 SAP HANA 최적화 기능과의 향상된 통합을 제공합니다. New Open SQL은 SAP HANA의 기능을 최대한 활용하여 성능을 개선할 수 있도록 설계되었습니다.

    2. 사용예제

    예제1) Inline Declaration

    DATA : LV_CARRID LIKE SFLIGHT-CARRID,
           LV_CONNID LIKE SFLIGHT-CONNID.
    
    SELECT CARRID,
           CONNID,
           FLDATE,
           @SY-DATUM AS DATUM,
           'X'       AS VALUE
      INTO TABLE @DATA(LT_SFLIGHT)
      FROM SFLIGHT
     WHERE CARRID = @LV_CARRID
       AND CONNID = @LV_CONNID
    ORDER BY CARRID, CONNID.

    New Open SQL은 Inline 선언 @DATA(LT_SFLIGHT)를 통해 결과값을 받는 변수를 간결하게 선언할 수 있습니다.

    @ 기호는 호스트 변수(host variable) 또는 ABAP 변수를 SQL 문 내에서 참조할 때 사용됩니다.

    이는 SQL 문이 ABAP 변수의 값을 안전하게 사용할 수 있도록 하며, 보안 취약점을 방지하는 데 도움을 줍니다.

    New Open SQL의 이 기능은 특히 변수 바인딩(variable binding)에 사용되며, SQL 문 내에서 ABAP 데이터를 직접 참조하고 조작할 수 있게 해줍니다.

     

     

    예제2) FIELDS

    DATA : LV_CARRID LIKE SFLIGHT-CARRID,
           LV_CONNID LIKE SFLIGHT-CONNID.
    
    SELECT
      FROM SFLIGHT AS A INNER JOIN SPFLI AS B
                           ON A~CARRID  = B~CARRID
                          AND A~CONNID = B~CONNID
    FIELDS A~CARRID,
           A~CONNID,
           A~FLDATE
     WHERE A~CARRID = @LV_CARRID
       AND A~CONNID = @LV_CONNID
     ORDER BY A~CARRID, A~CONNID
      INTO TABLE @DATA(LT_SFLIGHT).

    FIELDS 절을 사용하여 더 표현력 있고 간결한 쿼리 작성이 가능하며, 이를 통해 컬럼 목록을 더 명확하게 정의할 수 있습니다.

    JOIN조건이 복잡한 쿼리에서 필드를 확인하면서 WHERE조건을 코딩할때 유리합니다.

     

     

    예제3) DIV/ DIVISION/ MOD

    DATA : LV_CARRID LIKE SFLIGHT-CARRID,
           LV_CONNID LIKE SFLIGHT-CONNID.
    
    SELECT CARRID,
           CONNID,
           FLDATE,
           SEATSMAX,
           DIV( SEATSMAX, 10 )         AS DIV,
           DIVISION( SEATSMAX, 10, 1 ) AS DIVISION,
           MOD( SEATSMAX, 10 )         AS MOD
     FROM SFLIGHT
    WHERE CARRID = @LV_CARRID
      AND CONNID = @LV_CONNID
    ORDER BY CARRID, CONNID
     INTO TABLE @DATA(LT_SFLIGHT).

    DIV: 두 피연산자 간의 나눗셈을 수행하고, 나눗셈의 결과로 나온 몫을 반환합니다.

    DIVISION: 두 피연산자 간의 나눗셈을 수행하고, 나눗셈의 결과를 반환합니다.(결과값의 소숫점을 지정)

    MOD: 두 피연산자 간의 나눗셈을 수행하고, 그 결과로 나오는 나머지를 반환합니다.

     

     

    예제4) CEIL/ FLOOR/ ROUND

    DATA : LV_CARRID LIKE SFLIGHT-CARRID,
           LV_CONNID LIKE SFLIGHT-CONNID.
    
    SELECT CARRID,
           CONNID,
           FLDATE,
           PRICE,
           CEIL( PRICE )     AS CEIL,
           FLOOR( PRICE )    AS FLOOR,
           ROUND( PRICE, 0 ) AS ROUND
      FROM SFLIGHT
     WHERE CARRID = @LV_CARRID
       AND CONNID = @LV_CONNID
     ORDER BY CARRID, CONNID
     INTO TABLE @DATA(LT_SFLIGHT).

    CEIL: 실수 값을 받아 그보다 크거나 같은 최소의 정수로 올림하여 반환하는 함수입니다.(올림함수)

    FLOOR: 실수 값을 받아 그보다 작거나 같은 최대의 정수로 내림하여 반환하는 함수입니다.(내림함수)

    ROUND: 실수 값을 받아 그보다 가장 가까운 정수로 반올림하는 수학 함수입니다.(반올림함수)

     

     

    예제5) COALESCE/ ABS

    DATA : LV_CARRID LIKE SFLIGHT-CARRID.
    
    SELECT A~CARRID,
           B~CONNID,
           B~FLDATE,
           B~SEATSOCC,
           COALESCE( B~SEATSOCC_B, B~SEATSOCC_F, 10000000 ) AS COALESCE,
           B~PAYMENTSUM,
           ABS( B~PAYMENTSUM ) AS ABS
      FROM SCARR AS A LEFT OUTER JOIN SFLIGHT AS B
                              ON A~CARRID = B~CARRID
     WHERE A~CARRID = @LV_CARRID
     ORDER BY A~CARRID, B~CONNID
      INTO TABLE @DATA(LT_SFLIGHT).

    COALESCE: 주어진 인자 목록 중에서 NULL이 아닌 최초의 값을 반환합니다. 이 함수는 여러 개의 인자를 받을 수 있으며, 인자 목록에서 처음으로 나타나는 NULL이 아닌 값을 찾아 반환합니다. 

    위 예제에서는 먼저 B~SEATSOCC_B 필드가 NULL인제 체크하고 NULL이면 B~SEATSOCC_F필드가 NULL인치 체크합니다. 둘다 NULL인경우 10000000값을 반환합니다.

    ABS: 절대값(Absolute Value)을 계산하는 수학 함수로, 어떤 숫자의 양수 형태를 반환합니다.

    이 함수는 음수를 입력으로 받으면 그 수의 양의 값으로, 양수를 입력으로 받으면 그대로 양수를 반환합니다.

     

     

    예제6) CASE/ CAST

    DATA : LV_CARRID LIKE SFLIGHT-CARRID,
           LV_CONNID LIKE SFLIGHT-CONNID.
    
    SELECT CARRID,
           CASE CARRID WHEN 'AA' THEN 'American air'
                       WHEN 'AF' THEN 'Air France'
                       ELSE 'Etc'
                       END AS CARRID_DESC,
           CAST( PRICE AS CHAR )        AS PRICE_CHAR,
           CAST( PRICE AS DEC( 10,1 ) ) AS PRICE_DEC
      FROM SFLIGHT
     WHERE CARRID = @LV_CARRID
       AND CONNID = @LV_CONNID
     ORDER BY CARRID, CONNID
      INTO TABLE @DATA(LT_SFLIGHT).

    CASE: 특정 조건에 따라 다른 값을 반환하는 조건부 로직을 구현하는 데 사용되는 SQL 구문입니다.

    위 에제는 CARRIDI값이 'AA'이면 'American air'를 반환하고 'AF'이면 'Air France'를 반환하고 둘다 아니면 'Etc'를 반환 합니다.

    CAST: 한 데이터 타입을 다른 데이터 타입으로 변환하는 데 사용됩니다.

    이 함수는 데이터베이스 쿼리 내에서 데이터의 형식을 명시적으로 변환할 필요가 있을 때 유용하게 사용됩니다.

    예를 들어, 문자열 형식의 데이터를 날짜 형식으로 변환하거나, 정수를 실수로 변환하는 경우 등에 CAST를 사용할 수 있습니다.

     

     

    예제7) CONCATENATE

    DATA : LV_CARRID LIKE SFLIGHT-CARRID.
    
    SELECT CONCAT( CARRID, PLANETYPE )               AS STR1,
           CONCAT_WITH_SPACE( CARRID, PLANETYPE, 5 ) AS STR2,
           CARRID && PLANETYPE && 'TEST'             AS STR3,
           'CHAR1' && 'CHAR2'                        AS STR4
      FROM SFLIGHT
     WHERE CARRID = @LV_CARRID
      INTO TABLE @DATA(LT_SFLIGHT).

    CONCAT: 이 함수는 두 개의 문자열을 입력으로 받아 순서대로 이어붙여 새로운 단일 문자열을 생성합니다.

    CONCAT_WITH_SPACE:함수는 두 개의 문자열을 결합할 때 사이에 공백을 추가하는 특화된 함수입니다. 이 함수는 여러 문자열을 하나로 결합하면서, 지정된 수의 공백을 각 문자열 사이에 삽입합니다.

    &&: 이 연산자는 두 개 이상의 문자열을 서로 붙여 하나의 문자열로 만들때 간단하게 사용할 수 있습니다. 

     

     

    예제8) UNION/ UNION ALL

     SELECT CARRID, CONNID, FLDATE
       FROM SFLIGHT
      WHERE CARRID = 'AA'
    
     UNION
    
     SELECT CARRID, CONNID, FLDATE
       FROM SFLIGHT
      WHERE CARRID = 'AA'
    
     UNION
    
     SELECT CARRID, CONNID, FLDATE
       FROM SFLIGHT
      WHERE CARRID = 'LH'
       INTO TABLE @DATA(LT_SFLIGHT).

    UNION 연산자는 두 개 이상의 SELECT 쿼리의 결과를 하나의 결과 집합으로 결합하는 데 사용됩니다.

    이 연산자는 여러 개의 독립된 쿼리 결과를 단일 결과로 통합할 때 유용하며, 각 쿼리의 결과에서 중복된 행을 제거합니다.

    위 예제에서 UNION ALL 연산자를 사용하면 중복 제거를 하지 않고 모든 결과 행을 포함시킬 수 있습니다.

     

     

    예제9) JOIN OFFSET

    DATA : LV_MBLNR LIKE MKPF-MBLNR.
    
    SELECT A~MBLNR,
           A~MJAHR
      FROM MKPF AS A INNER JOIN MSEG AS B
                        ON B~MJAHR = LEFT( A~BUDAT, 4 )
     WHERE A~MBLNR = @LV_MBLNR
       AND A~MJAHR = @SY-DATUM+0(4)
       AND A~MJAHR = LEFT( @SY-DATUM, 4 )
      INTO TABLE @DATA(LT_MBLNR).

    LEFT함수는 JOIN구문 사용시 조인조건의 필드길이가 서로 다를때 사용하면 편리합니다.

    JOIN조건 뿐만 아니라 WHERE조건에서도 사용 가능합니다.

     

     

    예제10) WITH

    WITH
          +CONNS AS (
            SELECT B~CARRNAME, A~CONNID, A~CITYFROM, A~CITYTO
              FROM SPFLI AS A INNER JOIN SCARR AS B
                            ON A~CARRID = B~CARRID
             WHERE A~CARRID = 'LH' ),
    
          +CNTS AS (
            SELECT COUNT(*) AS CNT
              FROM +CONNS )
    
          SELECT *
            FROM +CNTS CROSS JOIN +CONNS
           ORDER BY CARRNAME, CONNID
            INTO TABLE @DATA(LT_SPFLI).

    WITH 절을 사용하면, 하나의 SQL 문 내에서 임시 결과 집합을 생성하고, 이를 쿼리의 다른 부분에서 재사용할 수 있습니다. 이 기능은 복잡한 데이터 처리 로직을 구현할 때 특히 유용합니다.

     

    3. 장점

    NEW OPEN SQL의 함수 및 구문들은 복잡한 쿼리를 더 간결하고 읽기 쉬운 형태로 작성할 수 있게 해주어, 코드의 가독성을 크게 향상시킵니다.

    이를 통해, 코드의 오류 가능성을 줄이고 팀 내에서의 협업과 코드 공유가 용이해집니다.

    또한, 고급 함수와 표현식을 포함한 향상된 기능을 제공함으로써, 조건부 로직, 문자열 및 날짜 처리와 같은 복잡한 데이터 처리 요구사항을 쉽게 구현할 수 있습니다.