ABAP READ TABLE 사용법 및 예제 정리

ABAP 프로그램을 개발하면 많이 사용되는 구문은 SAP ABAP READ TABLE 입니다. read table은 인터널테이블의 데이터 중에서 조건(with key, index 등)에 맞는 행(Row)를 찾아오는 명령어입니다.

아주 많이 사용되는 명령어로 READ TABLE 의 기본적인 문법과 키워드, 예제를 정리해보았습니다.

SAP ABAP READ TABLE 기본 사용법

READ TABLE은 트랜스페어런트 테이블에서 조회한 값이나 가공을 통해 적재한 인터널 테이블로부터 조건에 맞는 단 ‘하나’의 Row를 가져올 때 사용하는 구문입니다.

SELECT FROM SFLIGHT 
  INTO TABLE @DATA(LT_SFLIGHT). 

SELECT * FROM SCARR 
  INTO TABLE @DATA(LT_SCARR). 

LOOP AT LT_SFLIGHT ASSIGNING FIELD-SYMBOL(<FS_SFLIGHT>). 

ENDLOOP.

SAP ABAP READ TABLE 사용법

ABAP READ TABLE 정의

READ TABLE 구문은 인터널 테이블 행을 읽는 구문이며, 테이블 키 혹은 SORT 이후 원하는  WHERE 조건으로 값을 찾아올 수 있습니다.

즉, 인터널 테이블에서 원하는 행을 조건을 통해 가져오는 구문입니다.

사용되는 시스템 필드는 SY-SUBRC, SY-TABIX 필드를 사용합니다.

SY-SUBRC의 주요 값은 다음과 같습니다.

  • 0 : 성공적으로 탐색함
  • 4 : 값을 찾지 못함
  • 8 : Binary Search 옵션으로 값을 찾지 못함

ABAP READ TABLE WITH KEY 옵션

인터널 테이블에 WITH KEY 다음에 정의된 키로 조건에 맞는 단 하나의 값을 조회하는 키워드 입니다.

SFLIGHT 테이블의 데이터를 조회한 후 결과 인터널 테이블로부터 READ TABLE를 사용하여, SFLIGHT 의 항공사 코드를 키로 하여 SCARR 항공사 정보를 가져오는 예제입니다.

DATA : LS_SCARR TYPE SCARR.

READ TABLE LT_SCARR INTO LS_SCARR WITH KEY
  CARRID = <FS_SFLIGHT>-CARRID.

IF SY-SUBRC EQ 0.
  MESSAGE S000 WITH LS_SCARR-CARRNAME.
ENDIF.

ABAP READ TABLE ~INDEX

READ TABLE INDEX [숫자] 구문은 [숫자] 행의 열 데이터를 명시적으로 가져오는 구문입니다.

아래의 예시는 READ TABLE로 SFLGHT 인터널 테이블의 1번째 행에 있는 데이터를 가져와서 항공사 이름을 출력하는 예제입니다.

READ TABLE LT_SCARR INTO LS_SCARR INDEX 1.

IF SY-SUBRC EQ 0.
  MESSAGE S000 WITH LS_SCARR-CARRNAME.
ENDIF.

ABAP READ TABLE  ~ BINARY SEARCH

인터널 테이블을 조회할 때 이진탐색 즉, Binary Search 옵션으로 검색하는 방법으로 일반 검색 보다 매우 빠릅니다.

보통 프로그램의 퍼포먼스가 좋지 않을 때 코드 튜닝을 하게 되면 이 부분부터 확인해 보게 됩니다.
이진 검색의 자세한 의미는 여기에서 확인할 수 있습니다.

아래 예시는 항공사 정보 테이블(SCARR)에 SFLIGHT의 CARRID 값을 키로 하여 BINARY SEARCH 하는 예제입니다.

READ TABLE LT_SCARR INTO LS_SCARR WITH KEY
  CARRID = <FS_SFLIGHT>-CARRID
BINARY SEARCH.

IF SY-SUBRC EQ 0.
  MESSAGE S000 WITH LS_SCARR-CARRNAME.
ENDIF.

단, Binary Search 구문을 쓰기 위해서는 반드시 인터널 테이블이 검색할 키를 기준으로 중복이 없고 Sorting 되어 있어야만 합니다.

SORT LT_SCARR BY CARRID.

ABAP READ TABLE 결과(RESULT) 담는 방법

READ TABLE로 읽은 결과는 Workarea 구조체 변수, Field-Symbol 그리고 transporting no fields 구분 3가지로 처리할 수 있습니다.

READ TABLE ~ INTO

READ TABLE INTO 구문은 주어진 조건 혹은 인덱스에서 값을 찾았을 때, 미리 선언한 구조체(Work Area)에 값을 담습니다. 즉, 복사합니다.

아래는 SFLIGHT-CARRID 값으로 찾은 열을 LS_SCARR 라는 구조체 변수에 복사하는 예제입니다. 이렇게 복사된 변수에서 꺼내 쓰면 됩니다.

READ TABLE LT_SCARR INTO LS_SCARR WITH KEY
  CARRID = <FS_SFLIGHT>-CARRID.

READ TABLE ~ ASSIGNING

READ TABLE 구문을 통해 인터널 테이블에서 값을 찾았을 때, 할당된 변수가 아닌 필드 심볼(FIELD-SYMBOL)에 할당합니다.

SFLIGHT-CARRID 값으로 조건에 맞는 값을 찾아 필드 심볼에 할당하는 예제입니다.

READ TABLE LT_SCARR ASSIGNING FIELD-SYMBOL(<FS_SCARR>) WITH KEY
  CARRID = <FS_SFLIGHT>-CARRID.

필드 심볼의 경우 into 문보다 속도가 빠르지만, 항상 SY-SUBRC를 체크해야 찾지 못한 경우 덤프(Dump)가 발생하지 않습니다.

READ TABLE ~ TRANSPORTING NO FIELDS.

READ 테이블을 통해 값을 찾았어도 변수 혹은 필드 심볼에 담지 않습니다.

그래서 일반적으로 해당 인터널 테이블에 값이 존재하는지 체크할 때 쓰이는 구문입니다. 타 언어로 보자면 isExist 등의 느낌이랄까요.

WorkArea 변수에 할당(복사)하는 과정이 없기 때문에 속도 개선에 효과가 있습니다.

아래의 예제는 LT_SCARR 인터널 테이블에서 CARRID 값 혹은 인덱스로 값을 찾았지만, WORKAREA는 담지 않도록 TRANSPORTING NO FIEDS 구문을 사용한 예제입니다.

READ TABLE LT_SCARR TRANSPORTING NO FIELDS
  WITH KEY
    CARRID = <FS_SFLIGHT>-CARRID.

IF SY-SUBRC EQ 0.
  MESSAGE S000 WITH '해당 키로 행이 있음을 체크'.
ENDIF.

READ TABLE LT_SCARR TRANSPORTING NO FIELDS
INDEX 1.

IF SY-SUBRC EQ 0.
  MESSAGE S000 WITH '테이블에 값이 있음을 체크'.
ENDIF.

READ TABLE 고려해야 할 사항

항상 READ TABLE을 사용하고자 할 때에는 대상 인터널 테이블의 키값이 무엇인지 잘 파악해 두고 Sorting 여부를 항상 먼저 체크해야 합니다.

가장 많이 사용되는 키워드 중에 하나가 BINARY SEARCH 옵션인데, 이를 잘 못 활용하면 성능에 큰 영향을 주게 됩니다.

만약 데이터의 중복 여부(키 값으로 중복 여부)가 확실치 않거나 인터널 테이블의 갯수가 크지 않을 때에는 Binary Search 없이 사용하는 것이 엉뚱한 데이터를 가져오는 것보다 나을 수 있습니다.

이상으로 ABAP READ TABLE 구문에 대해서 알아보았습니다.

더 상세한 사항은 SAP ABAP 공식 문서 READ TABLE을 확인해 보시기 바랍니다.