본문 바로가기

IT 이야기

ABAP 실무에서 매일 쓰는 SAP OpenSQL 문법 정리 (기초)

반응형

 

SAP OpenSQL 기초: ABAP 개발자를 위한 자주 쓰는 쿼리 정리

표준 테이블 조회부터 JOIN, UPDATE까지. ABAP 개발 실무에서 가장 많이 사용하는 OpenSQL 패턴을 보기 좋게 한 번에 정리했습니다.

1. SAP OpenSQL 이란?

SAP OpenSQL은 DB 종류(Oracle, HANA, MSSQL 등)에 상관없이 동일한 방식으로 데이터를 다룰 수 있게 해 주는 SAP 전용 SQL 문법입니다.

ABAP 개발자는 거의 모든 조회/저장 로직을 OpenSQL로 작성하게 되며, SELECT, INSERT, UPDATE, DELETE 네 가지가 기본 축입니다.

포인트
- OpenSQL을 잘 쓰면 DB 이식성, 성능, 가독성까지 한 번에 챙길 수 있습니다.
- 특히 HANA 환경에서는 SELECT ... INTO TABLE @DATA() 패턴을 많이 사용합니다.

2. 기본 SELECT 문법과 패턴

2-1. 단일 레코드 조회 (SELECT SINGLE)

DATA: ls_mara TYPE mara.

SELECT SINGLE *
  FROM mara
  INTO ls_mara
 WHERE matnr = @lv_matnr.

- SELECT SINGLE은 조건에 맞는 첫 번째 레코드 1건만 가져옵니다.

- 키 필드(예: MATNR, BUKRS 등)로 단건 조회할 때 자주 사용됩니다.

2-2. 다중 레코드 조회 (INTO TABLE)

DATA: lt_mara TYPE TABLE OF mara.

SELECT *
  FROM mara
  INTO TABLE lt_mara
 WHERE mtart = 'FERT'
   AND matnr BETWEEN @lv_matnr_low AND @lv_matnr_high.

- 결과를 내부테이블(lt_mara)에 한 번에 담는 가장 기본적인 패턴입니다.

2-3. 필요한 필드만 조회 (성능·가독성 향상)

DATA: lt_list TYPE TABLE OF ty_material. "필요 필드만 가진 TYPES

SELECT
    matnr,
    mtart,
    matkl,
    ersda
  FROM mara
  INTO TABLE @lt_list
 WHERE mtart = 'FERT'.

- 언제나 * 대신 필요한 컬럼만 선택하는 것이 좋습니다.

3. WHERE 조건 자주 쓰는 예시

3-1. 범위 조건 (BETWEEN, IN, NOT IN)

* BETWEEN
SELECT *
  FROM mara
  INTO TABLE @lt_mara
 WHERE matnr BETWEEN @lv_matnr_low AND @lv_matnr_high.

* IN / NOT IN (내부테이블 활용)
SELECT *
  FROM mara
  INTO TABLE @lt_mara
 WHERE matnr IN @lt_matnr_range
   AND matkl NOT IN @lt_matkl_ex.

3-2. 패턴 매칭 (LIKE)

* HD 또는 HP로 시작하는 자재만
SELECT *
  FROM mara
  INTO TABLE @lt_mara
 WHERE matnr LIKE 'HD%'
    OR matnr LIKE 'HP%'.

3-3. 날짜 조건 (오늘, 기간 등)

* 생성일이 특정 기간 안에 있는 자재
SELECT *
  FROM mara
  INTO TABLE @lt_mara
 WHERE ersda BETWEEN @lv_date_from AND @lv_date_to.
💡 TIP: 조건은 항상 인덱스 필드를 우선
WHERE 조건에 인덱스 필드(키 필드)를 먼저 사용하는 것이 성능상 유리합니다.

4. 정렬·그룹핑 (ORDER BY / GROUP BY)

4-1. ORDER BY 예시

SELECT
    matnr,
    ersda,
    mtart
  FROM mara
  INTO TABLE @lt_mara
 WHERE mtart = 'FERT'
 ORDER BY ersda DESC
          matnr ASC.

4-2. GROUP BY · 집계 함수

SELECT
    matkl,
    COUNT( * ) AS cnt_material,
    MAX( ersda ) AS last_created
  FROM mara
  INTO TABLE @lt_agg
 GROUP BY matkl.
📌 집계 함수
- COUNT( * ), SUM( ), MAX( ), MIN( ), AVG( ) 등을 GROUP BY와 함께 자주 사용합니다.

5. JOIN 형태별 예시 (내부조인, 외부조인)

5-1. INNER JOIN – 가장 기본

SELECT
    a~matnr,
    a~matkl,
    b~maktx
  FROM mara AS a
  INNER JOIN makt AS b
          ON b~matnr = a~matnr
         AND b~spras = 'E'
  INTO TABLE @lt_material.

- 공통 키(matnr) 기준으로 두 테이블을 가지런히 묶는 가장 기본적인 JOIN입니다.

5-2. LEFT OUTER JOIN – 기준 테이블 유지

SELECT
    a~matnr,
    a~matkl,
    b~maktx
  FROM mara AS a
  LEFT OUTER JOIN makt AS b
               ON b~matnr = a~matnr
              AND b~spras = 'E'
  INTO TABLE @lt_material.

- makt에 텍스트가 없어도 mara의 자재는 그대로 가져옵니다.

6. UPDATE / INSERT / DELETE 기본 형식

6-1. UPDATE 예시

UPDATE ztable
   SET field1 = @lv_field1
 WHERE key1   = @lv_key1
   AND key2   = @lv_key2.

IF sy-subrc = 0.
  COMMIT WORK.  "필요 시 명시적 커밋
ENDIF.

6-2. INSERT 예시

INSERT ztable FROM @ls_data.

IF sy-subrc <> 0.
  "에러 처리
ENDIF.

6-3. DELETE 예시

DELETE FROM ztable
 WHERE key1 = @lv_key1
   AND key2 = @lv_key2.
⚠️ 주의
- 대량 UPDATE/DELETE 시에는 WHERE 조건을 반드시 확인하고, 먼저 테스트 시스템에서 실행해보는 것이 안전합니다.
- 가능하면 SELECT ... FOR UPDATE나 BAPI/표준 FM 활용도 검토합니다.

7. 실무에서 자주 쓰는 OpenSQL 쿼리 모음 (Table 정리)

아래는 ABAP 개발 시 자주 사용하는 OpenSQL 패턴을 보기 좋게 표로 정리한 것입니다.

구분 설명 예시 코드 (핵심 부분)
단건 조회 키 기준 단일 레코드 조회
SELECT SINGLE *
  FROM mara
  INTO @ls_mara
 WHERE matnr = @lv_matnr.
다건 조회 내부테이블에 데이터 적재
SELECT *
  FROM mara
  INTO TABLE @lt_mara
 WHERE mtart = 'FERT'.
범위 조건 IN / BETWEEN 활용
SELECT *
  FROM mara
  INTO TABLE @lt_mara
 WHERE matnr IN @lt_matnr
   AND ersda BETWEEN
       @lv_date_from AND @lv_date_to.
패턴 검색 HD/HP로 시작하는 자재
SELECT *
  FROM mara
  INTO TABLE @lt_mara
 WHERE matnr LIKE 'HD%'
    OR matnr LIKE 'HP%'.
정렬 생성일 역순 + 자재번호
SELECT matnr, ersda
  FROM mara
  INTO TABLE @lt_mara
 ORDER BY ersda DESC,
          matnr ASC.
집계 자재그룹별 개수/최신일자
SELECT matkl,
       COUNT( * ) AS cnt,
       MAX( ersda ) AS last_date
  FROM mara
  INTO TABLE @lt_agg
 GROUP BY matkl.
JOIN (텍스트) MARA + MAKT 텍스트 조인
SELECT a~matnr,
       a~matkl,
       b~maktx
  FROM mara AS a
  INNER JOIN makt AS b
          ON b~matnr = a~matnr
         AND b~spras = 'E'
  INTO TABLE @lt_result.
LEFT JOIN 텍스트 없는 자재도 모두 조회
SELECT ...
  FROM mara AS a
  LEFT OUTER JOIN makt AS b
               ON ...
  INTO TABLE @lt_result.
UPDATE Z테이블 특정 필드 변경
UPDATE ztable
   SET status = @lv_status
 WHERE key   = @lv_key.
INSERT 새 레코드 추가
INSERT ztable FROM @ls_data.
DELETE 조건에 맞는 레코드 삭제
DELETE FROM ztable
 WHERE key = @lv_key.
💡 실무 팁
- 개발 중 자주 사용하는 패턴은 따로 메모(또는 개인 Z-레포지토리)해 두면, 새로운 프로그램을 만들 때 재사용성이 크게 올라갑니다.
- 특히 마스터(MARA/MAKT/MARC) + TEXT + T-code 조합은 자주 쓰이는 패턴이므로, 나만의 템플릿을 만들어두면 편합니다.
#SAP #ABAP #OpenSQL #SAP개발 #쿼리모음
반응형