콘텐츠
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테이블 데이터 삽입 (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내부 테이블 (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테이블 데이터 수정 (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테이블 데이터 삭제 (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.
ABAPDATA: 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.
ABAPSQL 성공 여부 확인하기 (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테이블 변경 사항 확정 (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