OPEN SQL은 DML만 사용가능하다.
명령어 | 설명 | 포인트 |
SELECT | 행 조회 | INTO 또는 INTO TABLE 사용 |
INSERT | 새 행 삽입 | 실패 시 sy-subrc 체크 |
UPDATE | 기존 행 수정 | WHERE 조건 필수 |
MODIFY | 삽입 또는 수정 자동 처리 | 키 유무로 삽입/수정 결정 |
DELETE | 조건에 맞는 행 삭제 | WHERE 또는 구조체 가능 |
SELECT - 데이터 조회
순서 | 절 | 설명 |
1️⃣ | SELECT | 가져올 필드를 지정 (또는 * 전체) |
2️⃣ | INTO | 데이터를 저장할 대상 (워크 영역 또는 내부 테이블) |
3️⃣ | FROM | 데이터를 가져올 테이블 이름 |
4️⃣ | WHERE | 조건절: 필터링 조건 지정 |
5️⃣ | GROUP BY | 그룹핑 기준 필드 지정 (집계 함수 사용 시) |
6️⃣ | HAVING | 그룹핑된 결과에 조건 추가 |
7️⃣ | ORDER BY | 결과 정렬 기준 필드 지정 |
- sql구문은 이 순서를 지켜야한다.
- 데이터베이스에서 하나의 라인 값을 읽을 경우에는 SINGLE을 사용한다
`SELECT SINGLE <cols> ... where'
- 여러 라인을 조회할 때는 select 결과가 내부 테이블에 저장되는데, 이를 인터널 테이블이라고 부른다.
Distinct 를 사용하게 되면 중복된 값이 제외된다.
`SELECT [DISTINCT] <cols> ... WHERE`
- INTO구문의 결과가 저장되는 곳이 인터널 테이블이 아닌 필드orWorkArea(구조체)일 때는 마지막에 ENDSELECT를 사용해야한다.
- gt_itab = 내부테이블
- gs_wa = 워크에어리어_구조체
- 구조체를 출력하는 코드
- sap 테이블인 sflight는 여러 필드_컬럼을 갖고 있음 => gs_wa는 로컬구조체가 되고, gs_wa-carrid 처럼 개별 필드에 접근할 수 있음
- TYPE sflight을 쓰면, 그 테이블의 행 구조를 그대로 복사하고 데이터는 들어있지 않고 구조만 복사됨
- Select 쓰면 실제 행을 읽어와서 gs_wa에 데이터를 담는 작업이 실행됨
- g_itab 내부테이블을 출력하는 코드
- DB에서 조건에 맞는 모든 데이터를 한꺼번에 gt_itab에 담고, LOOP AT으로 내부에서 반복함(메모리 반복)
비교
항목 | SELECT INTO TABLE | SELECT ... ENDSELECT |
데이터 처리 시점 | DB에서 모두 가져와서 한꺼번에 메모리로 | DB에서 한 줄씩 읽고 바로 처리 |
반복 방식 | LOOP AT 필요 | 자체 반복 (SELECT-ENDSELECT가 루프 역할) |
성능 | 대량 데이터 시, 메모리 사용 많음 | 대량 데이터 시, I/O 부담 적음 |
예시 비교 (결과는 같음)
① SELECT INTO TABLE + LOOP
SELECT * FROM sflight INTO TABLE gt_itab WHERE carrid = 'AA'.
LOOP AT gt_itab INTO gs_wa.
WRITE: / gs_wa-carrid, gs_wa-connid.
ENDLOOP.
② SELECT ... ENDSELECT
SELECT * FROM sflight INTO gs_wa WHERE carrid = 'AA'.
WRITE: / gs_wa-carrid, gs_wa-connid.
ENDSELECT.
=> 둘 다 "AA"인 항공편들을 같은 순서로 출력하게 됨
- as(Alias)
AS구문을 사용해서, 칼럼 명에 병명을 지정할 수 있음
gs_line = 'CARRID CONNID'.
SELECT DISTINCT carrid connid INTO TABLE gt_itab FROM sflight.
- gt_itab는 내부 테이블, 여러 줄 데이터를 담는다.
- gs_wa는 그 내부 테이블의 한 줄과 동일한 구조를 가진 구조체.
- gs_wa는 오직 하나의 row만 저장할 수 있다.
- LIKE LINE OF로 선언한 변수는 내부 테이블의 한 줄(row)을 임시로 담는 용도,
즉 "임시 저장소(temp variable)" 역할
Select intto corresponding fields of <Wa>
SELECT *
INTO CORRESPONDING FIELDS OF <워크에어리어>
FROM <테이블>
WHERE <조건>.
- 구조체에 필드가 일부만 포함되어 있을 때
- 또는 필드명이 DB테이블과 완전히 일치할 때 자동으로 매핑시켜줌
TYPES: BEGIN OF ty_flight_short,
carrid TYPE sflight-carrid,
connid TYPE sflight-connid,
END OF ty_flight_short.
DATA: gs_short TYPE ty_flight_short.
SELECT *
INTO CORRESPONDING FIELDS OF gs_short
FROM sflight
WHERE carrid = 'AA'.
WRITE: / gs_short-carrid, gs_short-connid.
EXIT.
ENDSELECT.
② Parameters
- Parameters 명령어를 이용하면 사용자가 값을 입력하는 화면_Selection Screen이 조회된다.
- gs_wa-carrid와 gs_wa-connid가 생성된다.
GPT와 함께 하는 실습 문제 set.
1.
첫번째 답
DATA : gs_wa TYPE sflight.
SELECT SINGLE * INTO gs_wa FROM sflight WHERE carrid = 'AA'.
WRITE: gs_wa-carrid.
ENDSELECT. "❌ 오류 발생
select문인데 왜 Endselect를 했을 때 오류가 생길까?
select single 은 단일 행 조회이기 때문에 block이 없기 때문이다.
data : gs_wa TYPE sflight.
SELECT single * into gs_wa from sflight where carrid EQ 'AA'.
- 이렇게 조회하면 AA의 이름을 가진 carrid가 출력이 된다.
2.
DATA : gt_itab TYPE TABLE OF sflight,
gt_temp TYPE sflight.
SELECT carrid, connid FROM sflight INTO CORRESPONDING FIELDS OF TABLE
@gt_itab WHERE carrid = 'AA'.
LOOP AT gt_itab INTO gt_temp.
WRITE : / gt_temp-carrid, gt_temp-connid.
ENDLOOP.
- 내부테이블에서 LOOP AT <내부테이블> into <작업구조> 형태로 루프를 돌릴 땐, 루프 안에서 한 줄씩 담아줄 작업구조, 즉 워크에어리어가 필요하다.
- `LOOP AT gt_itab ASSIGNING FILED-SYMBOL(<fs>)`처럼 field-symbol을 쓰면 gt_temp가 없어도 된다
3.
DATA : gt_itab TYPE TABLE OF sflight,
gt_temp TYPE sflight.
SELECT carrid, price INTO CORRESPONDING FIELDS OF TABLE
@gt_itab TYPE sflight
WHERE carrid = 'AA' AND price >= 300.
LOOP AT gt_itab INTO gt_temp.
WRITE : / gt_temp-carrid, gt_temp-price.
ENDLOOP.
- 꼭 @이 필요할까?
- @은 ABAP 7.40 이후 버전에서 도입된 ABAP new Syntax 때문에 등장함
✅ 다음 문제 (문제 5)
문제 5: SELECT SINGLE + 구조체 + 조건
- sflight 테이블에서 carrid = 'AA'이고 connid = '0017'인 데이터를 구조체 하나에 담아서,
- fldate, price, currency 3개 필드를 WRITE로 출력해보세요.
- 문제의 조건은 single이였는데, 못보고 그냥 풀어버렸다.
- single로 푼 문제.
처음에는 `SELECT SINGLE * INTO gt_itab...` 이렇게 풀려고 했으나, 컴파일이 안되는 것을 확인했다.
그 이유는 gt_itab 내부테이블은 여러 개의 행을 저장할 수 있는 자료형이지만, select single은 단 하나의 행만 가져오기 때문에
구조체 한 개짜리 공간이 필요하기 때문이다.
'SAP' 카테고리의 다른 글
easy abap 11. INSERT (0) | 2025.05.09 |
---|---|
easy abap 10. select - join & 그 외 문법 (0) | 2025.05.09 |
easy abap 08. R/3 Architecture, OPEN SQL (0) | 2025.05.07 |
easy abap 07. constants, statics, tables (0) | 2025.05.07 |
easy abap 06. abap dictionary table, view, structure, move, move-corresponding, 구조체의 산술연산 (0) | 2025.05.07 |