[ABAP] OPEN SQL, NATIVE SQL / OPEN SQL 데이터 읽기 - SELECT, INTO, FROM


🌝 OPEN SQL vs. NATIVE SQL



🌜 OPEN SQL


  • ABAP 언어에서만 사용

  • Data Interface를 통해 NATIVE SQL(데이터베이스에서 사용되는 SQL 언어)로 번역됨

  • DML 언어만 사용 가능

    • DML : Data Manipulation Language (데이터 처리 언어)

    • SELECT, UPDATE, INSERT, DELETE

  • Local Buffer를 사용할 수 있음

  • ABAP 프로그램을 활성화할 때 자동으로 Syntax Check가 수행됨


🌜 NATIVE SQL


  • 데이터베이스에 직접 접속해 DML, DDL 언어 사용 가능

    • DDL : Data Definition Language (데이터 정의어)

    • CREATE, ALTER, DOP, TRUNCATE

  • OPEN SQL의 Command Set(SELECT, UPDATE, DELETE, ..)을 사용할 수 있음


🌜 Local Buffer


  • SAP Local Buffer는 R/3 Architecture에서 지원하는 기술로서 데이터베이스의 부하를 줄이는 중요한 역할을 담당

    • Local Buffer란? 각 장치마다 제어하기 위해 설치된 장치 컨트롤러에 장치로부터 들어오고 나가는 데이터를 임시로 저장하기 위한 작은 메모리
  • 테이블의 Technical Setting에서 Buffer를 사용한다고 설정해야 함



🌝 OPEN SQL : 데이터 읽기 - SELECT



🌜 Single Line


  • 데이터베이스에서 하나의 라인 값을 읽어올 때 SINGLE 사용

  • 하나의 데이터만 가져오기 때문에 WHERE 조건에 유일한 킷값이 추가되어야 하는데, WHERE 구문이 잘못 되어 여러 개의 라인을 읽어온다면 임의의 라인을 반환


🌜 Several Line


  • 여러 라인을 조회할 때는 SELECT 결과가 내부 테이블에 저장되는데, ABAP에서는 이것을 인터널 테이블(Internal Table)이라 부른다.

  • INTO 구문의 결과가 저장되는 곳이 인터널 테이블이 아닌 필드 또는 Work Area일 때에는 마지막에 ENDSELECT를 사용해야 함 -> 하나의 값을 읽어서 구조에 삽입, 조건에 해당하는 값을 모두 읽어 올 떄까지 LOOP를 수행

    • INTO : SELECT에서 읽어온 데이터를 변수에 저장, 이 변수를 ABAP 프로그램에서 사용
  • ex)

      REPORT ZTEST.
    
      DATA : GT_ITAB TYPE STANDARD TABLE OF SFLIGHT,
          GS_WA TYPE SFLIGHT.
    
      SELECT * INTO TABLE GT_ITAB
          FROM SFLIGHT
          WHERE CARRID EQ 'AA'.
    
      LOOP AT GT_ITAB INTO GS_WA.
          WRITE : /GS_WA-CARRID, GS_WA-CONNID.
      ENDLOOP.
    



🌝 OPEN SQL : 데이터 읽기 - INTO


  • SELECT 구문에서 조회한 결괏값을 변수(Target Area)에 저장하는 기능을 수행


🌜 Work Area


  • 여러 컬럼의 한 라인만 조회하고자 할 경우 Work Area에 값을 할당

  • CORRESPONDING FIELDS OF 구문 사용 시 한 번에 Work Area의 동일 필드명에 값 할당


🌜 Internal Table


  • 여러 라인을 조회하는 경우 인터널 테이블을 사용

  • APPENDING은 인터널 테이블에 추가로 INSERT / INTO는 인터널 테이블의 데이터 삭제 후 INSERT

  • PACKAGE SIZE : 인터널 테이블에 몇 개의 라인을 추가할 것인가를 설정, 이 경우 ENDSELECT 구문을 반드시 사용해야 함



🌝 OPEN SQL : 데이터 읽기 - FROM


  • FROM 구문은 데이터를 SELECT 할 대상 테이블(or 뷰)를 지정

  • FROM 구문에서 사용 가능한 Option

    • ` CLIENT SPECIFIED` : 자동 client 설정 해제

    • BYPASSING BUFFER : SAP Local Buffer에서 값을 읽지 않음, 테이블이 Buffering 설정되어 있더라도 바로 데이터베이스 테이블에서 SELECT 수행

    • UP TO n ROWS : SELECT의 row 개서 제한, 사용자 실수로 대량의 데이터를 요청할 때 데이터베이스 성능 저하를 예방할 수 있음

  • 정적/동적으로 TABLE 선언 가능

    • 정적으로 테이블을 선언할 때는 Alias를 사용할 수 있으며, 이 경우 테이블 명을 SELECT 구문에서 사용할 수 없다.

    • 동적으로 테이블을 선언할 때는 테이블 이름을 반드시 대문자로 지정해야 하며, ABAP Dictionary에 존재하는 이름이어야 한다.


🌜 JOIN


JOIN : CROSS JOIN, INNER JOIN, LEFT JOIN, RIGHT JOIN

  • JOIN에 사용되는 필드가 인덱스에 존재할 때 빠른 성능이 보장됨

  • ABAP OPEN SQL에는 INNER JOIN과 LEFT OUTER JOIN만 사용 가능

  • ex)

      REPORT ZTEST.
    
      TYPES : BEGIN OF t_str,
          carrid TYPE sflight-carrid,
          carrname TYPE scarr-carrname,
          END OF t_str.
    
      DATA : gs_str TYPE t_str.
    
      SELECT SINGLE a~carrid b~carrname
          INTO CORRESPONDING FIELDS OF gs_str
          FROM sflight AS a
          INNER JOIN scarr AS b
          ON a~carrid EQ b~carrid
          WHERE a~carrid = 'AA'.
    
      WRITE : gs_str-carrid, gs_str-carrname.
    

Categories:

SAP/ABAP