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.
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을 확인해 보시기 바랍니다.