ABAP 기초: Open SQL 활용 Table 데이터 조회, 삽입, 수정, 삭제

Open SQL

Open SQL 은 ABAP 에서 사용하기 위해 정의 되어 있는 SQL 이다. 이는 SAP 가 여러가지 DB (Oracle, Sybase 등) 과 연결 될 때, DB 에 종속 되지 않고 동일한 SQL 문법을 이용해 프로그래밍을 할 수 있게 해준다.

이와 반대되는 개념으로 DB의 SQL 을 Native SQL 이라 칭한다. Open SQL 은 자동으로 Native SQL 로 변환되어 DB 를 통해 데이터를 가져올 수 있다.

따로 별도의 선언, 추가 없이 ABAP 의 하나로 동작하여 코드 내 SQL 문을 직접 입력하고 변수에 바로 담기게 된다.

테이블 데이터 조회 (SELECT)

테이블의 데이터 조회는 SELECT 문으로 가능하다. 특이한 점은, ABAP 프로그래밍 구문 사이에 작성 되어 SELECT 문 단독으로 사용 되지 않고 INTO 를 통해 변수에 값을 담아야 한다.

값을 담으면 WRITE 문 등으로 출력해 데이터를 확인할 수 있다.

아래 코드는 데모 테이블 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
SELECT ~ ENDSELECT 출력 결과
SELECT ~ ENDSELECT 출력 결과

테이블 데이터 삽입 (INSERT)

Open SQL 의 삽입 시엔 INSERT 문을 이용한다. ABAP 의 구조체 변수에 값을 담고 한 행씩 테이블에 삽입 하거나, 내부 테이블 에 담고 한꺼번에 여러 행을 추가할 수도 있다.

구조체 (Structure) 에 담고 삽입 하기

DATA: wa_sflight TYPE sflight.

wa_sflight-carrid = 'TE'.
wa_sflight-connid = '0001'.
wa_sflight-fldate = '20231016'.

INSERT sflight FROM wa_sflight.
ABAP
SE11 에서 삽입한 데이터 확인
SE11 에서 삽입한 데이터 확인

내부 테이블 (Internal Table) 에 담고 한꺼번에 삽입 하기

DATA: it_sflight TYPE TABLE OF sflight,
      wa_sflight TYPE sflight.

wa_sflight-carrid = 'TE'.
wa_sflight-connid = '0401'.
wa_sflight-fldate = '20231016'.
APPEND wa_sflight TO it_sflight.

wa_sflight-carrid = 'TE'.
wa_sflight-connid = '0402'.
wa_sflight-fldate = '20231017'.
APPEND wa_sflight TO it_sflight.

INSERT sflight FROM TABLE it_sflight.
ABAP
SE11 에서 삽입한 데이터 확인
SE11 에서 삽입한 데이터 확인

테이블 데이터 수정 (UPDATE)

UPDATE 문은 테이블의 특정 조건(WHERE)에 해당 하는 행들의 필드 값을 수정한다. 다음 코드는 위에 생성한 TE / 0001 / 20231016 의 PRICE와 SEATSMAX 값을 변경한다.

UPDATE sflight
SET price = 450 SEATSMAX = 10
WHERE carrid = 'TE'
  AND connid = '0001'
  AND FLDATE = '20231016'.
ABAP
SE11 에서 수정한 데이터 확인
SE11 에서 수정한 데이터 확인

테이블 데이터 삭제 (DELETE)

DELETE 문은 UPDATE 와 같이 WHERE 을 이용해 조건에 맞는 값을 삭제 한다. 삭제 후 SE11 에서 더 이상 해당 조건의 값이 조회 되지 않는지 확인 한다.

DELETE FROM SFLIGHT
WHERE carrid = 'TE'
  AND connid = '0001'
  AND FLDATE = '20231016'.
ABAP

테이블 데이터 삽입과 수정 동시에 수행 (MODIFY)

MODIFY 문은 구조체내부 테이블에 담긴 값을 데이터베이스 테이블에 삽입 혹은 수정 한다.

이는 담긴 값에 해당하는 키 값에 따라 다른 동작을 하는데, 같은 키 필드 값을 지닌 행이 테이블 내에 없으면 삽입 되고 존재하면 키 필드 값 외에 데이터가 수정 된다.

DATA: wa_sflight TYPE sflight.

wa_sflight-carrid = 'TE'.
wa_sflight-connid = '0001'.
wa_sflight-fldate = '20231016'.
wa_sflight-price = '40'.

MODIFY sflight FROM wa_sflight.
ABAP
위의 코드로 생성 된 데이터 (SE11)
위의 코드로 생성 된 데이터 (SE11)
DATA: wa_sflight TYPE sflight.

wa_sflight-carrid = 'TE'.
wa_sflight-connid = '0001'.
wa_sflight-fldate = '20231016'.
wa_sflight-price = '50'. "price 값만 변경

MODIFY sflight FROM wa_sflight.
ABAP
위의 코드로 수정 된 데이터: PRICE 값만 변경 되었다. (SE11)
위의 코드로 수정 된 데이터: PRICE 값만 변경 되었다. (SE11)

SQL 성공 여부 확인하기 (SY-SUBRC)

ABAP 에선 프로그래밍 수행 결과, 현 시스템의 상태 등 여러 정보가 담겨 있는 시스템 변수가 있다. 이 변수는 별도의 선언 없이 기본적으로 존재한다.

SY-SUBRC 는 그 중, 수행 된 여러 명령문의 결과 값을 나타낸다. 지금의 경우엔 SQL이 정상적으로 성공 되었는지 확인한다.

SY-SUBRC 값 설명:

  • 0: 성공
  • 4: 실패
  • 8: 명령문이 부분적으로 성공 등, 불완전 하게 수행 되었음을 나타냄
  • 12, 16, 20, 24, 28: 실패를 세분화한 코드 값 (그러나, SQL 에선 실제 운영 시 이 코드 값을 본 적이 없음)

예를 들어 SELECT 문을 사용 했을 시 값이 존재하면 0을 없으면 4가 변수에 담긴다.

DELETE FROM sflight
WHERE carrid = 'TE'
  AND connid = '0001'
  AND fldate = '20231016'.

WRITE / sy-subrc. "정상적으로 수행 되어 0을 출력

DELETE FROM sflight
WHERE carrid = 'TE'
  AND connid = '0001'
  AND fldate = '20231016'.

WRITE / sy-subrc. "이미 삭제한 데이터를 삭제 시도 하였으므로 실패하여 4를 출력
ABAP
SY-SUBRC 출력 결과
SY-SUBRC 출력 결과

테이블 변경 사항 확정 (COMMIT WORK) 혹은 취소 (ROLLBACK WORK)

Open SQL 을 이용해 수행 했던 작업을 확정 혹은 취소 할 수 있다. 만약 ABAP 프로그램이 실행 도중 중간에 오류가 발생 했을 때 앞에 동작했던 작업을 취소 할 수 있고, 모든 작업이 전부 오류 없이 수행 되었을 때 확정 할 수 있다.

많은 프로그램이 SY-SUBRC 와 조합되어 다음과 같은 형태로 사용되고 있다.

DELETE FROM sflight
WHERE carrid = 'TE'
  AND connid = '0001'
  AND fldate = '20231016'.

IF sy-subrc = 0.
  COMMIT WORK.
ELSE.
  ROLLBACK WORK.
ENDIF.
ABAP
0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x
목차
위로 스크롤