Internal Table이란 C언어의 구조체 배열이나 자바의 객체 배열를 생각하면 된다. (같은 용도, 같은 개념으로 쓰인다)
생성 방법
1. Local Table Tyep을 이용한 인터널 테이블 생성
2. Global ABAP Dictionary Type을 이용한 인터널 테이블 생성
1번 방법
TYPES : BEGINOF S_TYPE,
NO(6) TYPE C,
NAME(10) TYPE C,
PART(16) TYPE C,
ENDOF S_TYPE.
DATA GT_ITAB TYPE STANDARD TABLEOF S_TYPE WITH NON-UNIQUE KEYNO WITHHEADERLINE.
GT_ITAB-NO='0001'.
GT_ITAB-NAME='EASY ABAP'.
GT_ITAB-PART='SAP TEAM'.
APPEND GT_ITAB.
GT_ITAB-NO='0002'.
GT_ITAB-NAME='EASY ABAP2'.
GT_ITAB-PART='SAP TEAM2'.
APPEND GT_ITAB.
LOOP AT GT_ITAB.
WRITE : / GT_ITAB-NO, GT_ITAB-NAME, GT_ITAB-PART.
ENDLOOP.
2번 방법
DATA : GT_ITAB TYPE SORTED TABLEOF SCARR WITH UNIQUE KEY CARRID.
DATA : GS_STR LIKELINEOF GT_ITAB.
SELECT*
INTO TABLE GT_ITAB
FROM SCARR.
LOOP AT GT_ITAB INTO GS_STR.
WRITE : / GS_STR-CARRID, GS_STR-CARRNAME.
ENDLOOP.
인터널 테이블과 헤더 라인
- 헤더라인 = WORK AREA, 인터널 테이블 선언 시 WITH HEADER LINE 구문 추가하면 됨
- 헤더라인이 있으면 Internal Table 이름이 그대로 헤더 라인을 뜻하게 된다.
- 헤더라인이 있을 때의 MODIFY
MODIFY TABLE ITAB. = MODIFY TABLE ITAB FROM ITAB. " 이 때 뒤의 ITAB은 ITAB의 헤더라인을 뜻한다.
헤더라인 있을 때
TYPES : BEGINOF T_STR,
COL1 TYPE I,
COL2 TYPE I,
ENDOF T_STR.
DATA : GT_ITAB TYPE TABLEOF T_STR WITHHEADERLINE.
DO3TIMES.
GT_ITAB-COL1=SY-INDEX.
GT_ITAB-COL2=SY-INDEX**2.
APPEND GT_ITAB. " = APPEND GT_ITAB TO GT_TAB.
ENDDO.
LOOP AT GT_ITAB.
WRITE : / GT_ITAB-COL1, GT_ITAB-COL2.
ENDLOOP.
헤더 라인 없을 때
TYPES : BEGINOF T_STR,
COL1 TYPE I,
COL2 TYPE I,
ENDOF T_STR.
DATA : GT_ITAB TYPE TABLEOF T_STR WITHHEADERLINE.
DO3TIMES.
GT_ITAB-COL1=SY-INDEX.
GT_ITAB-COL2=SY-INDEX**2.
APPEND GT_ITAB. " APPEND GT_ITAB TO GT_TAB.
ENDDO.
LOOP AT GT_ITAB.
WRITE : / GT_ITAB-COL1, GT_ITAB-COL2.
ENDLOOP.
*OCCURS를 이용한 선언
DATA : GT_ITAB TYPE T_STR OCCURS0.
DATA : GT_ITAB2 TYPE TABLEOF T_STR.
- 위 둘 다 헤더라인이 없는 인터널 테이블 선언이다.
- 차이점은 TABLE OF 라는 명령어가 없이 'OCCURS n'을 넣어 메모리를 얼마나 할당하느냐는 구문으로 TABLE임을 암시하며 INTERNAL TABLE을 생성한다는 점이다.
- 헤더 라인 없이 프로그래밍을 하는 것이 권장되는 방식이다. 즉, TYPE TABLE OF T_TYPE 으로 인터널 테이블을 사용하는 것이 권장된다. (실무적으로는 OCCURS 0을 많이 쓰는 듯)
인터널 테이블 종류
- STANDARD TABLE, SORTED TABLE, HASHED TABLE 3가지로 나뉜다.
STANDARD TABLE
- 순차적인 INDEX를 가지는 테이블, TREE 구조
- INDEX를 이용하여 ENTRY를 찾을 때 바람직한 구조. READ, MODIFY, DELETE 구문을 사용할 때도 INDEX를 사용하므로 자주 사용할 듯(여기서 INDEX는 데이터베이스 오브젝트인 INDEX가 아니라 인터널 테이블에서 데이터가 위치하는 ROW의 번호를 뜻할 뿐이다.)
" 1. STRUCTURE TYPE 선언
TYPES : BEGINOF T_LINE,
FIELD1 TYPE CLENGTH5,
FIELD2 TYPE CLENGTH4,
FIELD3 TYPE I,
ENDOF T_LINE.
" 2. STANDARD TABLE 타입 선언
TYPES : T_TAB TYPE STANDARD TABLEOF T_LINE WITH NON-UNIQUE DEFAULT KEY.
- DEFAULT KEY. 구문은 CHAR 타입으로 선언된 모든 컬럼들을 키 컬럼으로 정의하는 것. 선언하지 않아도 선언된 것으로 간주한다.
- READ TABLE은 개별 LINE에 접근하는 문장
- INDEX, WITH TABLE KEY, WITH KEY 등 을 사용하여 인터널 테이블의 ROW를 찾아간다.
- DEFAULT KEY. 를 적었으므로 FIELD1, FIELD2가 모두 키 값이므로 WITH TABLE KEY로 데이터를 찾을 때는 두 변수 모두 적어주어야 한다.
- 키 값 이외의 값으로 찾을 때는 WITH KEY 를 사용한다.
SORTED TABLE
- STANDARD 테이블과 SOTRED TABLE은 INDEX 테이블이다. SORTED TABLE은 KEY값으로 항상 정렬된 인터널 테이블이다. STANDARD 와의 차이점은 UNIQUENESS인데, SORTED TABLE 사용 시 WITH UNIQUE를 사용할 수 있지만 STANDARD TABLE은 항상 NON-UNIQUE만 사용할 수 있다.
- SORTED TABLE은 내부적으로 BINARY SEARCH를 이용하기 때문에 TABLE ENTRY수와 탐색 속도는 정적 상관관계를 맺는다. UNIQUE 여부를 명시해야하며 이미 SORT되어 있기 때문에 SORT 명령어를 사용하면 오류가 발생한다.
" 1. STRUCTURE 선언
TYPES : BEGINOF T_LINE,
COL TYPE C,
SEQ TYPE I,
ENDOF T_LINE.
" 2. SORTED TABLE 타입 선언
TYPES : T_TAB TYPE SORTED TABLEOF T_LINE WITH UNIQUE KEY COL.
" 3. INTERNAL TABLE 선언
DATA : GT_ITAB TYPE T_TAB WITHHEADERLINE.
GT_ITAB-COL='B'.
GT_ITAB-SEQ='1'.
INSERT TABLE GT_ITAB.
GT_ITAB-COL='A'.
GT_ITAB-SEQ='2'.
INSERT TABLE GT_ITAB.
CLEAR GT_ITAB.
READ TABLE GT_ITAB INDEX2.
WRITE : / GT_ITAB-COL, GT_ITAB-SEQ. " A -> B 로 정렬되어 있어 KEY가 B인 라인이 출력
- INSERT 대신 APPEND 구문을 사용하면 정렬에 문제가 생겼다는 DUMP ERROR가 발생한다.
HASHED TABLE
- 순차적인 INDEX를 가지고 있지 ㅇ낳음
- HASH 값으로 계산된 KEY로만 탐색할 수 있다.
- HASH 알고리즘을 사용하므로 ENTRY 수와 관계없이 응답속도는 항상 같다.
- 반드시 UNIQUE로 선언되어야 한다.
인터널 테이블 종류별 속도 비교
- 인터널 테이블의 종류가 3가지나 있는 것은 상황에 따라 바람직한 방식이 다르기 때문이다.
- 대부분 STANDARD 형태를 쓰지만 상황에 맞는 종류의 인터널 테이블을 사용해 데이터 탐색 시간을 줄여 성능을 높이는 것이 좋다.
- 빠르게 교재를 훑고 있으므로 깊게 다루지 않고 정리한 표만 보고 넘어감
- 기본적으로 INSERT가 많으면 STANDARD, READ가 많으면 SORTED가 바람직하다.
- 하지만 성능을 고려해야 한다면 귀찮더라도 UNIQUE한 KEY값을 인터널 테이블로 선언하여 프로그래밍하여 가장 read성능이 좋은 HASHED TABLE을 쓰는 것이 바람직하다.