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은 단 하나의 행만 가져오기 때문에 

구조체 한 개짜리 공간이 필요하기 때문이다.

 

+ Recent posts