Internal Table을 쓰면서 생각해 보면
pro/c ,esql/c 등에서 써보안던 cursor를 생각이 나게 된다.
Data를 Select하여 cursor라는 공간에 넣어 다음에 loop를 돌면서 data를 처리하는 방식이라고
생각하면 제일 간단한 계념이라고 생각이 든다.
하지만 Cursor가 제공하는 기능보다는 더 많은 기능을 가지고 있으며, 다양한 기능이
담겨 있다.
Internal table 의 종류에는 4종류가 있다.
다양한 종류는 교재를 참고하면 충분히 이해 하리라 본다.
1. Field String
- 여러개의 필드로 구성된 레코드. SAP GUI의 메모리를 차지한다.
- physical oracle database와는 아무 관련이 없고, program 실행시에 의미가 있는 logical한 영역이다.
- TABLES 문 다음에 선언해주는 table은 실질적으로는 field string을 선언해주는 것이다.
2. Internal table(with header line)
ex> data : begin of it_tab occurs 0 with header line,
a ,
b,
end of it_tab.
data : it_tab like bkpf occurs 0 with header line.
2-1. Internal table을 사용하는 이유
- DB가 메모리에 있기 때문에 속도가 빠르다.
- report를 출력하기 위해서.
2-2. Internal table(with header line)의 선언
- DATA절에 선언한다.
- LIKE를 이용한다.(권장)
- header line이 없는 Internal table처럼 선언하고 뒤에 WITH HEADER LINE구문을 붙인다.
2-3. Internal table을 채우는 방식
2-3-1. APPEND <itab> [SORTED BY <field>]
순서
I) MOVE-CORRESPONDING으로 work area 즉, header line에 넣는다.
II) APPEND명령으로 hearder line에서 Internal table로 넣는다.
- default는 descending. occurs 다음의 숫자만큼만 APPEND 되어 ranking list가 만들어진다.
- SORTED BY를 생략하면 occurs 다음의 숫자와 관계없이 read된 순서대로 APPEND된다.
- header line을 이용하지 않고 internal table을 채우고 싶다면 APPEND <wa> TO <itab>. 이라고 한다. 이 방식이 <itab> = <wa>나 APPEND <itab>보다 빠르다.
2-3-2. COLLECT
- header line의 P, I, F field를 internal table의 내용과 비교하여 같은 것이 있으면 data를 누적하고, 없으면 append한다.
- 이때, field의 type 중 P, I, F를 제외하고 비교한다.
2-3-3. INSERT문을 사용한다.
2-3-4. MODIFY문은 data가 있으면 update하고 없으면 insert한다.
- MODIFY itab [INDEX idx].
[TRANSPORTING f1 ... fn [WHERE cond]].
- LOOP 안에서 MODIFY itab.이라고 해 준다면 현재의 line이 MODIFY된다.
- 특정 line을 MODIFY를 할 때는 INDEX idx를 해준다.
- 특정 line을 WHERE조건을 써서 MODIFY 할 때는 TRANSPORTING ...을 해 준다.
- f1 ... fn은 MODIFY할 field명이다.
- LOOP 밖에서 INDEX나 TRANSPORTING을 사용할 때는 반드시 SY-SUBRC를 check해 준다.
- 특히 LOOP 밖에서 index를 사용하지 않으면 short dump를 발생시킨다.
2-4. data를 읽어오는 방식.
2-4-1. LOOP AT <itab> ... ENDLOOP
- data를 순차적으로 읽는다.
- LOOP문 안에는 INSERT, DELETE, MODITY문이 올 수 있다.
2-4-2. READ문을 사용하면 data를 명확한 single field를 읽을 수 있다.
- SY-TABIX 필드는 work area가 마지막으로 읽었던 record의 index를 가지고 있다. 즉, 현재 header line 내용의 index이다.
- INSERT, DELETE, MODIFY문도 SY-TABIX를 이용해서 dynamic하게 접근할 수 있다.
- 특히 MODIFY의 경우 INDEX절이 있는 경우 INDEX 다음의 값은 반드시 table내에 존재하고 있는 값이어야 한다.
- LOOP문과 READ문을 사용한 후에는 반드시 SY-SUBRC를 이용하여 error check를 한다. SY-SUBRC의 값은 성공일 때 0, data가 없을 때 4, error일 때 8이다.
- COMPARING option을 사용하면 COMPARING 다음에 적어주는 field의 header line의 값이 internal table에 있는 지도 check한다. COMPARING은 INDEX, WITH KEY, BINARY SEARCH등과 함께 쓰여야 의미가 있다. SY-SUBRC가 0이면 READ한 결과도 존재하고 COMPARING 다음의 field다음의 값도 존재한다. 2면 READ 한 결과는 존재하지만 COMPARING 다음의 field는 존재하지 않는다. 4면 READ한 결과가 존재하지 않는다.
- TRANSPORTING NO FIELDS라는 option을 붙이면 data가 존재하는 여부를 check하여 SY-SUBRC에 넣고, 해당 line의 index를 SY-TABIX에 넣는다. 이때, header line의 값은 변하지 않는다.
2-5. SORT문으로 sort할 수 있다.
- Default는 ascending이다.
2-6. 기타
- CLEAR <tab>은 header line을 initialize한다. header line이 없는 internal table은 body부분을
initialize한다.
ex> clear it_tab.
- REFRESH <tab>은 internal table의 모든 entry를 delete한다. 하지만 internal table은 memory를 차지하고 있다.
ex> refresh it_tab.
- FREE <tab>은 모든 entry를 지우고, memory space도 release한다.
- table에 대한 정보출력은 describe문으로 한다.
- <itab>[]과 같은 방식으로 Internal table을 참조하면 header line이 없는 Internal table과 같다. 이 방식은 header line이 있는 Internal table의 몸통을 직접 참조한다.
- occur문 뒤의 숫자는 예상되는 레코드의 수이다. 실제 레코드의 수가 앞서의 숫자보다 많아도 삽입은 된다. Internal table은 application server의 Rollback area를 사용한다.
3. Internal table(without header line)
3-1. 목적
- Internal tables allow you to reproduce very complex data structures in ABAP/4 programs
3-2. 특징
- header line이 있는 Internal table보다 약간 빠르다.
- work area를 직접 핸들링해야 한다.
3-3. 선언
- type선언을 하고 DATA절에서 like를 한다.
3-4. 기타
- 기타 삽입 등은 work area를 사용하는 것만 주의하면 Internal table(with header line)과 같다.
- complex structure는 반드시 header line이 없어야 한다.
- CLEAR문은 다른 것과 달리 header line이 있는 internal table에서 다르게 작용한다.
[출처] 5.Internal Table|작성자 angelii1004