[Easy ABAP 2.0] SAP ERP 입문자의 독학 공부기록 📚 [03. OPEN SQL & NATIVE SQL-1]

jimi·2025년 5월 15일

이지 아밥 2.0

목록 보기
6/11
post-thumbnail

목차
1. Overview
2. OPEN SQL - 데이터 읽기
3. OPEN SQL - 데이터 변경
4. NATIVE SQL

OPEN SQL & NATIVE SQL

➡️ 01. Overview

1. R/3 아키텍쳐

SAP R/3는 세개의 계층으로 분류됨.

1. Presentation Layer

: 사용자 GUI. GUI를 구성하는 소프트웨어 컴포넌트들의 정보를 가지고 있다.

2. Application Layer

: ABAP 프로그램 실행.
운영 서버의 Application Layer는 하나 또는 여러개의 Application Layer와 하나의 Message Server로 구성됨.

Message Server: Application Layer와 통신하며 부하가 적은 서버에 사용자가 로그온 되도록 함.
(여러개의 Application Layer를 구동하는 것은 시스템의 부하를 분산하기 위한 목적임.)
SAP는 Application Server 레벨에서 Local Buffer가 존재하고, ABAP Dictionary 테이블 레벨에서 버퍼 설정을 하게 되면 데이터베이스까지 접근X, Local Buffer에서 데이터를 읽어온다.

Dispatcher(분배기): Work Process를 적절히 분배하는 역할을 담당한다.

3. Database Layer

모든 데이터 보관. (SQL 과 주로 연관).
ABAP Dictionary로 구조 정의.

SAP는 일반 개발자에게 DB에 직접 접속하여 Data를 수정하는 행위를 금지하고 있음.
ICST(무결성, 일관성, 안정성, 투명성) 보장을 위함!!!!!

  • ABAP Dictionary : ABAP 프로그램에 사용되는 오브젝트들(Table, View, Structure, Types...). 데이터 구조를 정의하고 관리하는 역할을 수행함.

2. SQL의 정의

다음 3가지로 구분됨.

  1. DML(Data Manipulation Language) 데이터 처리 언어

DB(테이블)에 저장된 데이터를 조회·삽입·수정·삭제

  1. DDL(Data Definition Language) 데이터 정의 언어

테이블 등 구조 생성.
응용 프로그램과 DB 관리 시스템 간에 데이터 요구를 표현할 수 있는 인터페이스를 기술하기 위한 언어.

  1. DCL(Data Control Language) 데이터 제어 언어

권한·무결성 제어.
데이터를 보호하고 관리하는 목적으로 사용됨.

3. SQL의 종류

OPEN SQL, NATIVE SQL 두가지.

4. OPEN SQL, NATIVE SQL 비교

1) OPEN SQL

  • ABAP 전용 → DB Interface 통해 변환
  • 각각 다른 오라클, MS SQL 과 같은 DB 환경에서도 같은 명령어를 사용함.
  • DML(SELECT, INSERT, …)만 사용할 수 있음.
  • Local Buffer 사용 가능.
  • NATIVE SQL 보다 사용 방법이 간단함.
  • 프로그램 활성화시 자동 Syntax Check 수행됨.

2) NATIVE SQL

DB에 직접 접속하여 DML·DDL 모두 사용할 수 있음.

OPEN SQL로 해결되지 않는 복잡한 SQL은 NATIVE SQL을 이용할 수 있음.

  • Local Buffer란?
    : R/3 Architecture 에서 지원하는 기술.
    DB의 부하를 줄이는 중요한 역할을 담당함.
    (테이블의 Technical Setting 에서 Buffer를 사용한다고 설정함.)
  • 질문: 로컬 버퍼가 부하를 줄이는 역할을 담당한다고 했는데, 이걸 직접 개발자가 주는 것인지? ABAP 내에서 자동으로 동작되는 것인지?

SQL의 실행순서

  1. MARC 테이블에서 WERKS = '1101'인 데이터를 조회하는 SQL 실행
  2. DB Interface에서 NATIVE SQL로 해석하여 테이블에서 WERK 필드 '1101'인 값 가져옴 .
  3. MARC 테이블에는 WERKS = '1101'인 row가 3건.
    해당 데이터가 Local Buffer에 저장됨.
  4. DB에서 값을 가져오는 구문이 성공하게 되면 EXIT.
    프로그램이 Display 하는 값은 '1101'의 첫번째 값이 됨.
  5. 다시 해당 SQL 을 실행하면 Local Buffer에 이미 존재하기 때문에! DB에 접근X. 바로 Local Buffer의 데이터를 반환 함.

➡️ 02. OPEN SQL: 데이터 읽기

  • SELECT
  • INTO
  • FROM
  • WHERE
  • GROUP BY
  • HAVING
  • ORDER BY

✅ 1. SELECT 구문

SELECT <lines> <columns> ...
  1. Single Line

하나의 라인 값을 읽어오고자 할 경우 SINGLE을 사용함.

하나의 데이터만 불러오므로 정확한 정보를 알고 있어야 함.

SELECT SINGLE <cols> ...WHERE
  1. Several Lines

여러 라인을 조회할 때 SELECT 결과가 내부 테이블에 저장됨.
인터널 테이블(internal table)이라고 부름.

  1. AS

별명

  1. 동적인 SELECT 구문
SELECT <lines> (<itab>) ...

✅ 2. INTO 구문

SELECT 구문에서 조회한 결괏값을 변수에 저장하는 기능 수행 .

1) 구조체 (Work Area)

여러 컬럼의 한 라인만 조회하고자 할 경우에 Work Area(변수, 구조체)에 값을 할당함.
*를 사용하면 개별 필드를 SELECT 하는 것보다 비효율적임.

SELECT * 구문은 성능에 아주 큰 영향을 미칠 수 있음... 사용을 삼가하기.

2) Internal Table

여러 라인을 조회할 경우에는 인터널 테이블을 사용함.
APPENDING은 인터널 테이블에 추가로 INSERT하고,
INTO는 인터널 테이블의 데이터를 삭제한 다음 INSERT 한다.

3) Single Field

테이블의 개별 컬럼을 조회하거나 Aggregate 함수 사용할 때 사용함.

SELECT ... INTO (f1, f2, ...) ...

2개의 필드가 필요한 경우

SELECT carrid connid INTO (gv_carrid, gv_connid) FROM SFLIGHT.

✅ 3. FROM 구문

: 데이터를 SELECT할 대상 테이블을 지정함.

FROM 구문의 Option

  • CLIENT SPECIFIED
  • BYPASSING BUFFER
  • UP TO n ROWS

3.1 정적인 TABLE 선택

하나의 테이블을 정적으로 선언할 때 사용.
테이블명을 SELECT 구문에서 사용할 수 없음.

SELECT ... FROM <dbtab> [AS <alias>] <options>

3.2 동적인 TABLE 선택

테이블 이름을 동적으로 선언하여 사용할 수 잇음.
테이블 이름은 대문자로 지정해야함!!
ABAP Dictionary 에 존재하는 이름이어야 함.

SELECT ... FROM (dbtab).

3.3 JOIN 구문

관계형 DB에서 여러개의 테이블 값을 동시에 읽어 올 경우 JOIN을 사용하게 됨.
일반적으로 PK, FK를 사용하여 JOIN 하는 경우가 대부분이지만 때로는 논리적인 값들의 연관으로 JOIN하는 경우도 존재.
연결 조건은 ON 사용.

'테이블 간의 JOIN 하기보다 인터널 테이블에 데이터를 저장하고 나서 LOOP 구문을 이용하여 추가 정보를 SELECT 하여 인터널 테이블 내용을 MODIFY 하는 경우'
-> LOOP를 수행하면서 DB에 반복적으로 접근하게 됨. 비효율적임~!

프로그램을 느리게 만드는 주요 원인 중 하나는 하드디스크에 저장된 데이터에 빈번하게 접근하는 것이므로 JOIN이 가능한 경우에는 JOIN을 사용하기.

where 조건이 먼저 수행. 그다음 on 구문으로 JOIN 수행됨.

3.4 INNER JOIN과 OUTER JOIN

JOIN의 종류

  • INNER JOIN
  • OUTER JOIN

3.5 Line 수 제한

다음 구문으로 테이블에서 읽어오는 라인 수 제한함.

SELECT ...FROM <tab> UP TO <n> ROWS ...

✅ 4. WHERE 구문

사용자가 원하는 데이터를 정확하게 선택할 수 있도록 하는 조건.

  • BETWWEN A AND B
  • LIKE 'ABC%'.
  • LIKE 'ABC_' (한자리만 비교할 경우)
  • A IN ('A', 'B')
  • A IN (Selection Table)
  • WHERE (동적 조건)
  • FOR ALL ENTRIES IN (동적조건) WHERE (cond)

✅ 5. GROUPING 구문

  • AVG
  • COUNT
  • MAX
  • MIN
  • STDDEV (표준편차)
  • SUM
  • VARIANCE (분산)

OPEN SQL에서 SUM 을 이용하여 INTO CORRESPONDING FIELDS OF TABLE 구문을 사용하면, 원하는 결과를 가져오지 못한다. 이때 AS 구문을 이용해 별명을 지정해야함.

✅ 6. GROUPING 조건: HAVING

HAVING구문은 GROUP BY로 조회한 SELECT 구문에 그룹의 조건을 추가함.
WHERE과 같이 동적 선언이 가능함.

✅ 7. SORT 구문

ORDER BY로 정렬.

ORDER BY PRIMARY KEY

  • 테이블의 KEY에 의해 정렬됨.
  • select * 인 경우에만 사용 가능.
  • JOIN 구문 및 VIEW 에서는 사용 X.

✅ 8. Subquery

Subquery는 select 구문의 where 조건에 또다른 select 구문을 추가하여 값을 제한하는 목적으로 사용됨.

8.1 Scalar Subquery

: select 절 안에 기술된 select절로 정의됨.
하나의 행으로부터 하나의 칼럼 값만을 반환하는 Subquery. JOIN과 유사한 역할을 수행함.

조건
1. 반드시 한 컬럼만 반환해야함
2. Nested Loop 방식으로 처리됨.
3. 실행되는 횟수는 row 수.
4. 반복되는 코드나 마스터 유형의 테이블을 조회하는 경우 사용하면 효율적.

8.2 Non-Scalar Subquery

Exists 구문을 이용하여 구현함.
Subquery 결과 존재하면 true, 없으면 false.


➡️ 03. OPEN SQL: 데이터 변경

✅ INSERT 구문

테이블에 하나 또는 여러개의 데이터 삽입.

✅ UPDATE 구문

테이블의 하나 또는 여러 line을 변경.

  • 싱글 라인
UPDATE <target> FROM <wa>.
  • 여러 라인
UPDATE <target> FROM TABLE <itab>

✅ DELETE 구문

테이블에 하나 또는 여러 line의 데이터를 삭제함.

✅ MODIFY (Inserting or Changing Lines) 구문

UPDATE 구문과 INSERT 구문을 합한 기능을 수행함.
데이터가 테이블에 존재하면 UPDATE 하고, 없으면 INSERT를 수행한다.


➡️ 03. NATIVE SQL

OPEN SQL 은 DB종류에 상관없이 모든 오브젝트 조회 가능.
NATIVE SQL은 DB 종류에 따라 사용할 수 있는 SQL 구문 다름.

  • 장점: ABAP Dictionary 에 생성되지 않은 테이블에 접근할 수 있다. DB에 의존적인 SQL구문이므로 OPEN SQL에서는 불가능한 정밀한 SQL이 가능함.
  • 단점: 다른 DB를 사용하는 환경에는 사용X.

기본 구문

EXEC SQL .
	<NATIVE SQL statement>
ENDEXEC
  • 변수명 앞에는 콜론(:) 기호 추가해야 함.
  • Client를 구분하는 MANDT 필드를 SQL 구문 내에 반드시 포함해야 함. (그렇지 않으면 테이블 전체 FULL SCAN. 성능 문제)

PERFORMING 구문을 사용하여 한 번에 여러개의 데이터를 Internal Table에 삽입할 수 있음.

SUBSTRING

SUBSTRING: ABAP은 lv+offset(len), DB는 SUBSTR()

다음과 같은 문자열이 있을 때 문자 'CD'를 추출하는 경우

DATA : LV_CHAR TYPE C(10).
LV_CHAR = ABCDE.

ABAP에서

LV_CHAR+2(2)

오라클 SQL에서

SUBSTR(LV_CHAR, 3, 2)

: DB간 연결을 의미함.
DB Link 설정은 BC에게 요청.

테이블명@DB링크이름

OPEN SQL에서도 SYNONYM을 통해서 원격에서 DB 테이블에 접근할 수 있음. SYNONYM은 오라클 테이블에 대한 별명을 의미함.

Fetch Size

SQL구문은 DB서버에서 Application서버로 데이터양을 최소화하여 전송하도록 구성해야 함.

ABAP 프로그램에서는 Fetch Size를 설정할 수 없음. 오라클에서 설정된 Fetch Size를 기본으로 이용하게 됨.


추가

  • SELECT * 지양
    필요한 컬럼만 명시하면 네트워크 왕복량 줄고 성능↑

  • FOR ALL ENTRIES
    내부 테이블 itab 기준으로 한 번에 조회

  • Native SQL 최소화하기

  • ABAP Workbench란?
    : SAP 시스템 내에서 ABAP 개발 전반을 수행하는 통합 개발 환경(IDE)
  • FOR ALL ENTRIES IN (동적조건) WHERE (cond) 어떻게 쓰는건지?
    : FOR ALL ENTRIES는 내부 테이블의 각 행 값을 바탕으로 한 번에 대량 조회할 때 유용한 문법
profile
멋진 SAP 전문가가 되기 위하여

0개의 댓글