-
5. ABAP 인터널 테이블SAP/개념정리 2025. 6. 22. 13:39
인터널 테이블(Internal Table)
- 프로그램 내에서 정의하여 사용할 수 있는 Local Table.
- 동적인 구조체 배열이라고도 정의할 수 있다.
struct sawon
{
char no[6];
char name[10];
char part[16];
}
struct s_type sawon[100];TYPES : BEGIN OF s_type
no(6) TYPE c,
name(10) TYPE c,
part(16) TYPE c,
END OF s_type.
TYPES t_type TYPE STANDARD TABLE OF s_type INITIAL SIZE 100.
DATA sawon TYPE t_type.위 코드는 왼쪽은 c언어로, 오른쪽은 ABAP로 작성한 코드이며, 같은 역할을 한다.
c 언어에서 구조체 배열을 사용하여 프로그램을 실행하면 array 구조가 이미 메모리에 load되어 100건의 방이 생성된다.
이처럼 c 언어가 배열을 선언할 때 미리 크기를 지정하는 반면, 인터널 테이블은 INITIAL SIZE 구문으로 데이블 크기만 선언할 뿐 미리 메모리에 Load 하지 않는다. 따라서 INSERT 또는 APPEND 구문을 사용하여 Line이 추가될 때마다 메모리에 Load 한다.
인터널 테이블 생성
DATA itab [TYPE | LIKE] STANDARD TABLE OF <t_itab> WITH [UNIQUE | NON-UNIQUE] KEY <keys> [WITH HAEDER LINE].
예시
TYPES : BEGIN OF s_type no(6) TYPE c, name(10) TYPE c, part(16) TYPE c, END OF s_type. DATA gt_itab TYPE STANDARD TABLE OF s_type WITH NON-UNIQUE KEY no WITH HAEDER LINE. gt_itab-no = '0001'. gt_itab-name = 'easy abap'. gt_itab-part = 'SAP team'. APPEND gt_itab. LOOP AT gt_itab. WRITE : gt_itab-no, gt_itab-name, gt_itab-part. ENDLOOP.
헤더라인(WITH HEADER LINE )
- WITH HEADER LINE은 인터널 테이블 선언 시, 해당 테이블과 같은 타입의 워크 영역(Work Area)을 함께 자동 생성해주는 옵션이다.
- 해당 옵션을 사용하면 인터널 테이블과 헤더라인(워크영역) 두 개가 생성된다.
DATA: it_tab TYPE STANDARD TABLE OF sflight WITH HEADER LINE.
위 코드는 아래 코드처럼 인터널 테이블과 워크영역을 따로 만든 것과 같음. 헤더라인 옵션을 사용하면 하나의 이름으로 둘 다 동작하게 만든다.
DATA: it_tab TYPE STANDARD TABLE OF sflight. DATA: it_tab_wa TYPE sflight. " <- 워크 영역
* 워크영역(Work Area)
- ABPA에서 인터널 테이블에 데이터를 추가하거나 읽어오거나 수정할 때 사용하는 행 단위 작업 공간이다.
왜 워크영역이 필요한가?
인터널 테이블은 여러 개의 행(레코드)를 담고 있는 구조이기 때문에, 하나의 행만을 다루고자 할 때 임시로 사용할 공간이 필요하다.
워크영역의 역할
1. 데이터 추가
wa_sflight-carrid = 'LH'. wa_sflight-connid = '400'. APPEND wa_sflight TO it_sflight. " 한 줄 추가
2. 데이터 읽기
READ TABLE it_sflight INTO wa_sflight WITH KEY carrid = 'LH'. IF sy-subrc = 0. WRITE: wa_sflight-connid. ENDIF.
3. 데이터 수정
READ TABLE it_sflight INTO wa_sflight INDEX 1. wa_sflight-carrid = 'AA'. MODIFY it_sflight FROM wa_sflight INDEX 1.
4. LOOP 돌릴 때
LOOP AT it_sflight INTO wa_sflight. WRITE: / wa_sflight-carrid. ENDLOOP.
인터널 테이블을 사용할 때 워크영역이 필요한 데 WITH HEADER LINE을 사용하면 자동 생성해주기 때문에 따로 선언할 필요가 없으며,
명령어 사용 시 워크 영역 정보를 생략할 수 있다.
Header Line 사용에 따른 비교
Header Line이 없는 경우 명령어 Header Line이 있는 경우 명령어 모든 인터널 테이블(standard, sorted, hashed type) INSERT wa INTO TABLE itab. INSERT TABLE itab. COLLECT wa INTO itab. COLLECT itab. READ TABLE itab... INTO wa. READ TABLE itab... MODIFY TABLE itab FROM wa... MODIFY TABLE itab... MODIFY itab FROM wa... WHERE ... MODIFY itab... WHERE ... DELETE TABLE itab FROM wa. DELETE TABLE itab. LOOP AT itab INTO wa... LOOP AT itab... Index 테이블(satndard, sorted type) APPEND wa TO itab. APPEND itab. INSERT wa INTO itab... INSERT itab... MODIFY itab FROM wa... MODIFY itab...
인터널 테이블 종류
1. Standard Table
- 순서 유지됨 (입력한 순서 그대로 저장)
- 기본적인 리스트 구조
- 중복 허용
- 인덱스 기반 접근 가능
- 키는 항상 Non-unique로 선언해야 하기 때문에, WITH UNIQUE 구문을 사용할 수 없다.
- 성능 : READ - 느림.
APPEND - 빠름.
* 인터널 테이블에서 Index는 단순히 테이블 내에 데이터가 위치하는 라인 순번을 의미한다.
2. Sorted Table
- 자동으로 정렬된 상태로 저장됨 (정의한 키 기준)
- 이진 검색(Binary Search) 가능 → 빠름
- 중복 키 허용 여부 설정 가능
- 인덱스 기반 접근 가능
- 선언할 때 unique/non-unique를 반드시 명시해야 한다.
- 성능 : READ - 빠름.
APPEND - 가장 느림.
3. Hashed Table
- 인덱스 없음
- 고유 키 기반으로만 저장 가능 (중복 X)
- 순서 없음
- 내부적으로 해시 알고리즘 사용 → 매우 빠른 검색
- 성능 : READ - 가장 빠름. (키 조건 필수)
APPEND - 느림.
* BINARY SEARCH 구문
- Standard Table과 Sorted Table에서 사용 가능.
- Standard Table에서 BINARY SEARCH를 사용하려면, 정렬을 해줘야한다. (SORT itab. 필수)
- Sorted Table은 자동으로 키 기준 정렬되므로 별도로 SORT하거나 BINARY SEARCH를 명시할 필요는 없다.
하지만 명시적으로 BINARY SEARCH를 쓸 수도 있다.
인터널 테이블 명령어
1. 인터널 테이블 값 할당
MOVE itab1 TO itab2. MOVE itab1[] TO itab2[]. MOVE-CORRESPONDING itab1 TO itab2.
- 첫 번째, 두 번째 코드는 인터널 테이블 타입이 같아야 한다. 타입이 다르면 칼럼 순서대로 값을 할당하기 때문에 에러가 날 수 있다.
타입이 다를 경우 MOVE-CORRESPONDING 구문을 사용하면 두 오브젝트 간 순서와 관계없이 같은 컬럼명에만 값을 할당할 수 있다.
- 헤더라인이 있는 인터널 테이블의 경우 헤더라인과 인터널 테이블 이름이 같기 때문에 헤더라인과 인터널 테이블의 body를 [] 기호를 이용해 구문한다. []기호가 있으면 인터널 테이블의 body라고 생각하면 된다.
2. 인터널 테이블 초기화
CLEAR itab. CLEAR itab[]. REFRESH itab. FREE itab.
- 헤더라인이 없으면 3개의 명령어는 동일하게 인터널 테이블의 body를 삭제한다.
- 헤더라인이 있을 경우
- CLEAR : 헤더라인을 삭제할 것인지, body를 삭제할 것인지 명시해줘야한다.
할당된 메모리 공간을 반환한다.
- REFRESH : 헤더라인은 유지되고, 데이터만 삭제한다.
메모리 공간은 그대로 가지고 있다.- FREE : 헤더라인과 데이터 둘 다 삭제한다.
메모리 공간은 반환한다.
* 프로그램 내에서 계속 사용할 테이블이라면 CLEAR 또는 REFRESH
더 이상 사용하지 않는 테이블이라면 FREE (메모리 절약 목적)
3. 인터널 테이블 정렬
SORT itab [ASCENDING | DESCENDING]. " 인터널 테이블의 key값으로 정렬 SORT itab [ASCENDING | DESCENDING] BY f1 [ASCENDING | DESCENDING]... " 특정 컬럼 정렬 SORT itab ... STABLE. " 시퀀스 유지
- Standard 또는 hashed 인터널 테이블에서 사용 가능.
- STABLE 옵션 : 동일한 정렬 키 값을 가진 항목들의 기존 순서를 유지한다.
STABLE 옵션 예시
DATA: BEGIN OF itab OCCURS 0, city TYPE string, name TYPE string, END OF itab. itab-city = 'Seoul'. itab-name = 'Alice'. APPEND itab. itab-city = 'Busan'. itab-name = 'Charlie'. APPEND itab. itab-city = 'Seoul'. itab-name = 'Bob'. APPEND itab. * 일반 정렬 SORT itab BY city. * 안정 정렬 SORT itab BY city STABLE.
city name 초기 입력 순서 Seoul Alice 1 Busan Charlie 2 Seoul Bob 3 - SORT BY city만 하면 Alice와 Bob의 순서가 뒤섞일 수 있음.
- SORT BY city STABLE이면 Alice → Bob 순서가 유지됨.
* 언제 쓰면 좋을까?
- 정렬 기준이 여러 개인 경우 (예: 두 번째 기준으로 정렬할 때 첫 번째 정렬 순서를 유지하고 싶을 때)
- 사용자에게 보여줄 데이터를 정렬하되, 같은 키일 때 입력 순서나 우선 순위를 유지하고 싶을 때
4. 인터널 테이블 속성 알아내기
DESCRIBE TABLE itab [LINES gv_line] [OCCURS gv_init] [KIND gv_kind].
- LINES : 인터널 테이블에 존재하는 현재 라인 수를 반환.
- OCCURS : 인터널 테이블의 초기 라인 수를 반환.
- KIND : 인터널 테이블의 종류를 반환.( Standard - T , Sorted - S , Hashed - H)
5. INSERT 구문
* key 값 이용 INSERT line INTO TABLE itab. " Key 값을 이용해 한 라인만 삽입 INSERT lines OF itab1 [FROM n1] [TO n2] INTO TABLE itab2. " Key 값을 이용해 여러 라인 삽입 * index 이용 INSERT line INTO itab [INDEX idx]. " index 값 위치에 한 라인만 삽입 INSERT lines OF itab1 INTO itab2 [INDEX idx]. " index 값 위치에 여러 라인 삽입
- Key 값 이용 시 반환 값
성공 시 : sy-subrc = 0
실패 시(같은 key 존재) : sy-subrc = 4 , 덤프 에러는 발생하지 않음
- Index 이용 시 반환 값
성공 시 : sy-subrc = 0, sy-tabix = index 값 반환
* 인터널 테이블 타입에 따른 INSERT
Standard 데이터는 인터널 테이블의 마지막 위치에 추가된다.
APPEND 구문과 같은 효과를 가진다.Sorted 데이터는 인터널 테이블의 순서에 따라 추가된다.
Non-Unique key 타입이라면 Duplicate Line은 같은 key 위에 추가된다.Hashed 데이터는 Table key의 Hash index 순서에 따라 추가된다. 6. APPEND 구문
APPEND line TO itab. " 한 라인만 삽입 APPEND lines OF itab1 TO itab2. " 여러 라인 삽입 APPEND lines OF itab1 [FROM n1] [TO n2] TO itab2. " 특정 인덱스 사이에 삽입
- INSERT 구문은 key와 index를 이용해 인터널 테이블에 데이터를 추가할 수 있지만,
APPEND 구문은 index만 이용 가능. (Hashed 테이블에서는 사용 불가능)
* 인터널 테이블 타입에 따른 APPEND
Standard 데이터는 인터널 테이블의 마지막 위치에 추가된다.
SORTED BY 옵션을 이용하여 key 값 기준으로 DESCENDING 정렬을 하면서 추가할 수 있다.Sorted 데이터가 정렬된 상태로 인터널 테이블에 추가되도록 로직을 구성해야한다. 그렇지 않으면 덤프 에러가 발생한다. Hashed APPEND 구문을 사용할 수 없다. * APPEND INITIAL LINE
- 인터널 테이블을 빈 공간에서 미리 생성한 후, 라인 추가.
APPEND INITIAL LINE TO itab. ~ APPEND wa TO itab.
7. COLLECT 구문
COLLECT wa INTO itab.
- 인터널 테이블의 숫자 타입 칼럼을 합산하는 기능을 수행.
key 값을 기준으로 하여 합산을 수행하며, key 값이 없는 테이블일 경우 char 타입 컬럼들을 기준으로 합산 한다.
- key 값을 제외한 컬럼들은 Numberic Type(f, i, p)으로 선언되어야 한다.
- 같은 key 값이 있을 때는 숫자 타입 컬럼을 합산하고, 없을 때에는 APPEND 기능을 수행.
8. MODIFY 구문
* key 이용해 변경 MODIFY TABLE itab FROM wa [TRANSPORTING f1 f2 ...]. " 한 라인만 변경. * where 조건을 이용해 변경 MODIFY TABLE itab FROM wa TRANSPORTING f1 f2 ... WHERE cond. " 여러 라인 변경. * index 이용해 변경 MODIFY itab FROM wa [INDEX idx] [TRANSPORTING f1 f2 ...]. " 한 라인만 변경.
- 한 라인만 변경 시, 인터널 테이블이 Non-Unique key 이고 중복된 값이 존재할 경우 첫 번째 라인이 변경된다.
TRANSPORTING 구문을 이용하여 해당 컬럼만 변경할 수 있다.
* 인터널 테이블 LOOP 처리 시 사용 가능한 구문
AT FIRST 인터널 테이블의 첫 번째 값이 실행될 때 수행된다. AT NEW f1 컬럼 f1에 새로운 값이 들어올 때 수행된다. AT END OF f1 컬럼 f1의 값이 마지막일 때 수행된다. AT LAST 인터널 테이블의 마지막 값이 실행될 때 수행된다. 9. DELETE 구문
* key 이용해 삭제 DELETE TABLE itab [FROM wa]. DELETE TABLE itab WITH TABLE KEY k1 = f1 ... kn = fn. * where 조건을 이용해 여러 라인 삭제 DELETE itab WHERE cond. * index 이용해 삭제 DELETE itab [INDEX idx]. " 한 라인만 삭제 DELETE itab FROM n1 TO n2. " n1 ~ n2 사이에 있는 라인 삭제 DELETE itab FROM n1. " n1 번째 이후의 모든 데이터 삭제 DELETE itab TO n2. " 처음부터 n2 번째에 존재하는 데이터 삭제 * 중복 라인 삭제 DELETE ADJACENT DUPLICATE ENTRIES FROM itab [COMPARING f1 f2 ... | ALL FIELDS].
- WITH TABLE KEY : Non-Unique key로 설정된 Standard의 경우 해당 구문으로 중복된 key 데이터 중에서 한 건만 삭제한다.
- ADJACENT DUPLICATE 구문 수행하기 이전에 SORT 구문으로 인터널 테이블을 정렬해야 원하는 결과를 얻을 수 있다.
COMPARING 구문을 사용하지 않으면, table key 값이 중복된 데이터를 삭제한다.
10. READ 구문
* key 값 이용해 읽기 READ TABLE itab FROM wa INTO result. READ TABLE itab WITH TABLE KEY k1 = f1 ... kn = fn INTO result. " 인터널 테이블에서 선언한 KEY 컬럼을 모두 기술. READ TABLE itab WITH KEY k1 = f1 ... kn = fn INTO result. " KEY 컬럼 이외의 컬럼으로 READ할 경우. * work area 할당 READ TABLE itab WITH TABLE KEY k1 = f1 ... kn = fn INTO wa [COMPARING f1 f2 ... | ALL FIELDS] [TRANSPORTING f1 f2 ... | ALL FIELDS | NO FIELDS]. * index를 이용해 읽기 READ TABLE itab INDEX idx INTO result. * BINARY SEARCH 대상 컬럼을 기준으로 정렬한 후 사용 READ TABLE itab WITH KEY k1 = f1 ... kn = fn INTO result BINARY SEARCH.
- READ TABLE 구문은 인터널 테이블에서 원하는 데이터를 읽을 때 사용한다.
- result는 read의 결과를 저장하게 되는 work area이다.
- 성공 시 sy-subrc = 0, 실패 시 sy-subrc = 4이다.
- sy-tabix 변수는 라인의 인덱스를 반환한다.
- COMPARING 옵션 : READ 구문의 결과값에 비교 조건을 추가한다.
즉, COMPARING 구문 다음에 기술된 필드들이 work area의 값과 인터널 테이블에 존재하는 값이 같으면 sy- subrc = 0, 같지 않으면 sy-subrc = 2를 반환한다.
- TRANSPORTING 옵션 : READ 한 결과를 해당 컬럼만 target에 저장하는 기능을 수행한다.
※ 참고
- WITH TABLE KEY : 키가 있는 구조에서 불러올때, SORTED HASHED
- WITH KEY : 키가 없는 구조에서 불러올때, STANDARD =>> 이걸 더 많이 쓴다.'SAP > 개념정리' 카테고리의 다른 글
8. Search Help (0) 2025.06.30 7. Lock Object (0) 2025.06.27 4. ABAP 서브루틴, 함수 (0) 2025.06.19 3. ABAP 조건문, 반복문 (0) 2025.06.19 2. ABAP SQL (0) 2025.06.16