콘텐츠
테이블 데이터 조회 (SELECT)
테이블의 데이터 조회는 Open SQL SELECT 문으로 가능하다. 그런데 담으려는 변수 타입에 맞춰 방법이 여러 개 존재한다. 그 방법에는 기본적인 SELECT 말고도 SELECT ~ ENDSELECT, SELECT SINGLE 등이 있다.
한 행씩 읽어 처리하기 (SELECT ~ ENDSELECT)
SELECT ~ ENDSELECT 는 조회 될 데이터를 한 행씩 변수에 담아 사용할 수 있다. 이는 프로그래밍 구문 중 반복문과 비슷한 형태로 이용된다. 이는 반복문과 같이 대량의 데이터를 조회할 경우 성능 이슈를 야기 할 수 있다.
아래 코드는 데모 테이블 SFLIGHT 에서 필드 (carrid connid fldate) 를 조회해 변수에 담아 출력한다.
DATA: lv_carrid TYPE sflight-carrid,
lv_connid TYPE sflight-connid,
lv_fldate TYPE sflight-fldate.
SELECT carrid connid fldate
FROM sflight
INTO (lv_carrid, lv_connid, lv_fldate).
WRITE: / lv_carrid, lv_connid, lv_fldate.
ENDSELECT.
ABAP전체 내용을 내부 테이블 (Internal Table) 담기 (INTO TABLE)
위의 방식 보다 자주 사용 되는 방식이다. 조회 된 테이블 데이터를 같은 구조를 지닌 내부 테이블에 전부 담는다. 이 내부 테이블을 반복해 데이터를 이용 하는 것이 SELECT ~ ENDSELECT 보다 성능 상 이점이 크다.
DATA: lt_table LIKE TABLE OF sflight,
ls_table LIKE sflight.
SELECT *
INTO TABLE lt_table
FROM sflight.
LOOP AT lt_table INTO ls_table.
WRITE: / ls_table-carrid, ls_table-connid, ls_table-fldate.
ENDLOOP.
ABAP위의 코드는 데모 테이블 SFLIGHT(항공) 에서 데이터를 가져와 내부 테이블 lt_table 에 담게 된다. 그리고 이 변수에 담긴 내용을 반복문 등을 통해 읽어 사용하게 된다. 출력 결과는 위와 같다.
전체 내용을 내부 테이블 (Internal Table) 담기 (INTO CORRESPONDING FIELDS OF TABLE)
위와 비슷한 동작을 하지만, INTO CORRESPONDING FIELDS OF TABLE 옵션은 조회 하는 테이블과 변수로 선언 된 내부 테이블의 필드가 서로 같지 않아도 같은 필드 명에 자동으로 데이터를 넣어준다.
INTO TABLE 은 서로 필드가 일치 하지 않으면 데이터를 담을 수 없다. 다음 구문에서 INTO TABLE 을 입력하면 데이터가 오류가 난다.
TYPES: BEGIN OF ty_table,
carrid LIKE sflight-carrid,
connid LIKE sflight-connid,
fldate LIKE sflight-fldate,
END OF ty_table.
DATA: lt_table TYPE TABLE OF ty_table,
ls_table TYPE ty_table.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE lt_table
FROM sflight.
LOOP AT lt_table INTO ls_table.
WRITE: / ls_table-carrid, ls_table-connid, ls_table-fldate.
ENDLOOP.
ABAP출력 결과는 위와 같다.
한 라인만 읽어 구조체 (Structure)에 담기 (SELECT SINGLE)
SELECT SINGLE 은 한 라인만 읽어 구조체에 담을 때 사용 한다. 주로 WHERE 절에서 특정 키를 지정한 후 무조건 한 가지 데이터를 반환 하는 경우에 사용한다.
주의할 점은, 만약 여러 개의 행이 조회 되었을 경우 맨 위의 행만 담기기 때문에 고유한 행을 조회 할 수 있도록 WHERE 절 조건을 제대로 지정해 줘야 한다.
SFLIGHT 테이블은 CARRID, CONNID, FLDATE 의 키 필드를 지니고 있다.
INTO 로 담기
조회 할 테이블을 타입으로 하는 구조체 변수를 생성해서 INTO 를 통해 담으면 된다.
DATA: ls_table TYPE sflight.
SELECT SINGLE *
INTO ls_table
FROM sflight
WHERE carrid = 'AA'
AND connid = '0017'
AND fldate = '20171219'.
WRITE: / ls_table-carrid, ls_table-connid, ls_table-fldate.
ABAPINTO CORRESPONDING FIELDS OF 로 담기
테이블 때와 같이 SELECT SINGLE 도 CORRESPONDING FIELDS OF 를 통해 조회 한 테이블 내용과 일치하는 필드에 자동으로 꽂아 사용할 수 있다.
서로 필드가 다른 구조체를 사용한 경우 INTO 를 사용할 시 오류가 발생 한다.
TYPES: BEGIN OF ty_table,
carrid LIKE sflight-carrid,
connid LIKE sflight-connid,
fldate LIKE sflight-fldate,
END OF ty_table.
DATA: ls_table TYPE ty_table.
SELECT SINGLE *
INTO CORRESPONDING FIELDS OF ls_table
FROM sflight
WHERE carrid = 'AA'
AND connid = '0017'
AND fldate = '20171219'.
WRITE: / ls_table-carrid, ls_table-connid, ls_table-fldate.
ABAP