From Zero to SAP
Open SQL CRUD 완전 정리 - INSERT, UPDATE, DELETE, MODIFY 본문
CRUD는 데이터베이스에서 수행하는 모든 작업을 4가지로 분류한 것이다.

SELECT는 앞 포스팅에서 충분히 다뤘으니, 이번에는 나머지 세 가지와 ABAP 전용 구문인 MODIFY까지 정리한다.
반드시 알아야 할 주의사항
INSERT, UPDATE, DELETE는 SAP 표준 테이블에 직접 사용하면 절대 안 된다. 표준 테이블의 데이터를 직접 건드리면 시스템 무결성이 깨질 수 있다. 표준 테이블 데이터 변경은 반드시 BAPI, BDC, LSMW 같은 SAP 표준 방식을 사용해야 한다. 이 포스팅의 내용은 직접 만든 Z 커스텀 테이블에만 적용하자.
1. INSERT — 데이터 생성
INSERT는 테이블에 새로운 행을 추가하는 구문이다. 단일 행을 추가할 수도 있고, 여러 행을 한 번에 추가할 수도 있다.
단일 레코드 삽입
한 행을 삽입하는 가장 기본적인 방법이다. 구조체에 값을 담아서 테이블에 넣거나 VALUE 구문을 사용하면 더 간결하게 쓸 수 있다.
" 방법 1 — 구조체 선언 후 삽입
DATA gs_zemp TYPE zemplist.
gs_zemp = VALUE #(
empcd = '1010'
depcd = 'D001'
pstion = '사원'
ename = '박옥순'
).
INSERT INTO zemplist VALUES @gs_zemp.
" 방법 2 — VALUE 인라인으로 한 줄에 처리 (더 간결)
INSERT INTO zemplist VALUES @( VALUE #(
empcd = '1010'
depcd = 'D001'
pstion = '사원'
ename = '박옥순'
) ).
다중 레코드 삽입
여러 행을 한 번에 삽입할 때는 인터널 테이블을 활용한다.
인터널 테이블에 추가할 데이터를 전부 담은 뒤 한 번의 INSERT로 처리하는 방식이다.
DATA gt_family TYPE TABLE OF zfamily.
gt_family = VALUE #(
( empcd = '1010' fnum = '01' relation = '1' fname = '박영식' bdate = '19650327' )
( empcd = '1010' fnum = '02' relation = '2' fname = '이정숙' bdate = '19670812' )
).
INSERT zfamily FROM TABLE @gt_family ACCEPTING DUPLICATE KEYS.
IF sy-subrc EQ 0.
MESSAGE '성공' TYPE 'S'.
ELSE.
MESSAGE '실패 (중복 키 존재)' TYPE 'E'.
ENDIF.
여기서 ACCEPTING DUPLICATE KEYS가 중요하다. 삽입하려는 데이터의 키 값이 이미 테이블에 존재하면 원래는 덤프 에러(프로그램 강제 종료)가 발생한다. 이 구문을 붙이면 에러 대신 중복된 행만 건너뛰고 나머지는 삽입하며, sy-subrc 값으로 성공 여부를 확인할 수 있다. 실무에서는 거의 항상 붙여두는 편이 안전하다.
2. UPDATE — 데이터 갱신
UPDATE는 이미 존재하는 데이터를 수정하는 구문이다. 테이블의 키 컬럼을 기준으로 해당 행을 찾아서 값을 바꾼다.
단일 레코드 갱신
구조체에 키 값과 변경할 값을 담아서 갱신한다. 이 방식은 구조체에 담긴 모든 필드 값으로 해당 행 전체를 덮어쓴다.
" 방법1
DATA gs_zemplist TYPE zemplist.
gs_zemplist-empcd = '1010'. " 키 값 — 이 직원을 찾아서
gs_zemplist-ename = '박옥순'.
gs_zemplist-email = 'POS@KOREA.COM'.
UPDATE zemplist FROM @gs_zemplist.
" 방법2
gs_zemplist = VALUE #(
empcd = '1010'
ename = '박옥순'
email = 'POS@KOREA.COM'
).
UPDATE zemplist FROM @gs_zemplist.
전체를 덮어쓰는 방식이 아니라 특정 컬럼만 바꾸고 싶을 때는 SET과 WHERE를 조합한다.
" empcd = '1010'인 직원의 email과 tel만 변경
UPDATE zemplist
SET email = 'POS@KOREA.COM'
tel = '010-1234-5678'
WHERE empcd = '1010'.
WHERE 조건에 해당하는 행이 여러 개라면 모두 갱신된다.
예를 들어 WHERE pstion = '사원'이라고 하면 사원 직급을 가진 모든 직원의 데이터가 바뀐다.
다중 레코드 갱신
인터널 테이블에 변경할 데이터를 담아서 한 번에 갱신한다.
" 다중 레코드 갱신
DATA gt_zemplist TYPE TABLE OF zemplist.
gt_zemplist = VALUE #(
( empcd = '1010' email = 'ABC@KOREA.COM' )
( empcd = '1011' email = 'DEF@KOREA.COM' )
( empcd = '1012' email = 'GHI@KOREA.COM' )
).
UPDATE zemplist FROM TABLE @gt_zemplist.
루프를 돌며 한 건씩 UPDATE하는 것보다 이 방식이 DB 접근 횟수를 줄여서 성능이 훨씬 좋다.
3. DELETE — 데이터 삭제
DELETE는 조건에 해당하는 행을 삭제하는 구문이다.
단일 레코드 삭제
구조체의 키 값을 기준으로 해당 행을 삭제한다.
DATA gs_zemplist TYPE zemplist.
gs_zemplist-empcd = '1010'.
DELETE zemplist FROM @gs_zemplist.
다중 레코드 삭제
인터널 테이블에 담긴 데이터에 해당하는 행들을 한 번에 삭제한다.
" 다중 레코드 삭제
DATA gt_zemplist TYPE TABLE OF zemplist.
gt_zemplist = VALUE #(
( empcd = '1010' )
( empcd = '1011' )
( empcd = '1012' )
).
DELETE zemplist FROM TABLE @gt_zemplist.
WHERE 조건으로 특정 조건에 해당하는 모든 행을 삭제할 수도 있다.
DELETE FROM zemplist WHERE empcd = '1010'.
주의
WHERE 조건을 빠뜨리면 테이블의 모든 데이터가 삭제된다.
DELETE 사용 전에 WHERE 조건을 반드시 확인하는 습관이 중요하다.
4. MODIFY — ABAP 전용 Upsert
MODIFY는 일반 SQL에는 없는 ABAP만의 구문이다. 한 마디로 "있으면 UPDATE, 없으면 INSERT" 다.
MODIFY = UPDATE + INSERT
키 값을 가진 데이터가 테이블에 이미 존재하면 UPDATE를 수행하고, 존재하지 않으면 INSERT를 수행한다.
데이터가 있는지 없는지 모르는 상황에서 유용하다. IF EXISTS 체크 없이 한 번에 처리할 수 있기 때문이다.
" 단일 레코드 — empcd '1010'이 있으면 email 갱신, 없으면 새로 삽입
DATA gs_zemplist TYPE zemplist.
gs_zemplist-empcd = '1010'.
gs_zemplist-email = 'UPDATE@KOREA.COM'.
MODIFY zemplist FROM @gs_zemplist.
" 다중 레코드 — 인터널 테이블의 모든 행에 대해 MODIFY 수행
MODIFY zemplist FROM TABLE @gt_zemplist.
(참고) NATIVE SQL이란?
OPEN SQL은 데이터베이스 종류(HANA, Oracle 등)에 상관없이 동일하게 동작한다.
SAP이 내부적으로 각 DB에 맞게 변환해주기 때문이다. 반면, NATIVE SQL은 특정 데이터베이스의 SQL 문법을 직접 사용하는 방식이다.
EXEC SQL.
<native SQL 구문>
ENDEXEC.
NATIVE SQL은 OPEN SQL에서 지원하지 않는 복잡한 쿼리를 사용할 수 있고, ABAP Dictionary에 없는 시스템 테이블에도 접근할 수 있다는 장점이 있다.
단점도 명확하다. 문법 체크가 되지 않아 덤프 에러 위험이 있고, DB 종류가 바뀌면 코드를 다시 작성해야 한다. 또한 MANDT(클라이언트 구분자) 필드를 직접 SQL에 포함해야 한다.
특별한 이유가 없다면 OPEN SQL을 쓰는 게 맞다. NATIVE SQL은 "이런 게 있다" 정도만 알아두자.
'ABAP > 이론' 카테고리의 다른 글
| ABAP 인터널 테이블 - Standard / Sorted / Hashed (키 종류,성능 비교) (0) | 2026.04.10 |
|---|---|
| ABAP 인터널 테이블 - TYPE vs LIKE / Work Area vs Header Line / LOOP WHERE / FILTER 초기화 / 정렬 (0) | 2026.04.10 |
| 09. ABAP Open SQL 심화 - JOIN, GROUP BY, 서브쿼리, WITH (0) | 2026.04.07 |
| 08. ABAP Open SQL WHERE 조건 완전 정리 - BETWEEN, IN, RANGE, FOR ALL ENTRIES (0) | 2026.04.07 |
| 07. ABAP Open SQL 기초 - SELECT 문법 완전 정리 (0) | 2026.04.07 |