
목차
1. Overview
2. OPEN SQL - 데이터 읽기
3. OPEN SQL - 데이터 변경
4. NATIVE SQL
SAP R/3는 세개의 계층으로 분류됨.
: 사용자 GUI. GUI를 구성하는 소프트웨어 컴포넌트들의 정보를 가지고 있다.
: 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를 적절히 분배하는 역할을 담당한다.
모든 데이터 보관. (SQL 과 주로 연관).
ABAP Dictionary로 구조 정의.
SAP는 일반 개발자에게 DB에 직접 접속하여 Data를 수정하는 행위를 금지하고 있음.
ICST(무결성, 일관성, 안정성, 투명성) 보장을 위함!!!!!
ABAP Dictionary : ABAP 프로그램에 사용되는 오브젝트들(Table, View, Structure, Types...). 데이터 구조를 정의하고 관리하는 역할을 수행함. 다음 3가지로 구분됨.
DML(Data Manipulation Language) 데이터 처리 언어 DB(테이블)에 저장된 데이터를 조회·삽입·수정·삭제
DDL(Data Definition Language) 데이터 정의 언어 테이블 등 구조 생성.
응용 프로그램과 DB 관리 시스템 간에 데이터 요구를 표현할 수 있는 인터페이스를 기술하기 위한 언어.
DCL(Data Control Language) 데이터 제어 언어 권한·무결성 제어.
데이터를 보호하고 관리하는 목적으로 사용됨.
OPEN SQL, NATIVE SQL 두가지.
1) OPEN SQL
2) NATIVE SQL
DB에 직접 접속하여 DML·DDL 모두 사용할 수 있음.
OPEN SQL로 해결되지 않는 복잡한 SQL은 NATIVE SQL을 이용할 수 있음.
- Local Buffer란?
: R/3 Architecture 에서 지원하는 기술.
DB의 부하를 줄이는 중요한 역할을 담당함.
(테이블의 Technical Setting 에서 Buffer를 사용한다고 설정함.)
- SELECT
- INTO
- FROM
- WHERE
- GROUP BY
- HAVING
- ORDER BY
SELECT <lines> <columns> ...
하나의 라인 값을 읽어오고자 할 경우 SINGLE을 사용함.
하나의 데이터만 불러오므로 정확한 정보를 알고 있어야 함.
SELECT SINGLE <cols> ...WHERE
여러 라인을 조회할 때 SELECT 결과가 내부 테이블에 저장됨.
인터널 테이블(internal table)이라고 부름.
별명
SELECT <lines> (<itab>) ...
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.
: 데이터를 SELECT할 대상 테이블을 지정함.
FROM 구문의 Option
하나의 테이블을 정적으로 선언할 때 사용.
테이블명을 SELECT 구문에서 사용할 수 없음.
SELECT ... FROM <dbtab> [AS <alias>] <options>
테이블 이름을 동적으로 선언하여 사용할 수 잇음.
테이블 이름은 대문자로 지정해야함!!
ABAP Dictionary 에 존재하는 이름이어야 함.
SELECT ... FROM (dbtab).
관계형 DB에서 여러개의 테이블 값을 동시에 읽어 올 경우 JOIN을 사용하게 됨.
일반적으로 PK, FK를 사용하여 JOIN 하는 경우가 대부분이지만 때로는 논리적인 값들의 연관으로 JOIN하는 경우도 존재.
연결 조건은 ON 사용.
'테이블 간의 JOIN 하기보다 인터널 테이블에 데이터를 저장하고 나서 LOOP 구문을 이용하여 추가 정보를 SELECT 하여 인터널 테이블 내용을 MODIFY 하는 경우'
-> LOOP를 수행하면서 DB에 반복적으로 접근하게 됨. 비효율적임~!
프로그램을 느리게 만드는 주요 원인 중 하나는 하드디스크에 저장된 데이터에 빈번하게 접근하는 것이므로 JOIN이 가능한 경우에는 JOIN을 사용하기.
where 조건이 먼저 수행. 그다음 on 구문으로 JOIN 수행됨.
JOIN의 종류
다음 구문으로 테이블에서 읽어오는 라인 수 제한함.
SELECT ...FROM <tab> UP TO <n> ROWS ...
사용자가 원하는 데이터를 정확하게 선택할 수 있도록 하는 조건.
OPEN SQL에서 SUM 을 이용하여 INTO CORRESPONDING FIELDS OF TABLE 구문을 사용하면, 원하는 결과를 가져오지 못한다. 이때 AS 구문을 이용해 별명을 지정해야함.
HAVING구문은 GROUP BY로 조회한 SELECT 구문에 그룹의 조건을 추가함.
WHERE과 같이 동적 선언이 가능함.
ORDER BY로 정렬.
ORDER BY PRIMARY KEY
- 테이블의 KEY에 의해 정렬됨.
- select * 인 경우에만 사용 가능.
- JOIN 구문 및 VIEW 에서는 사용 X.
Subquery는 select 구문의 where 조건에 또다른 select 구문을 추가하여 값을 제한하는 목적으로 사용됨.
: select 절 안에 기술된 select절로 정의됨.
하나의 행으로부터 하나의 칼럼 값만을 반환하는 Subquery. JOIN과 유사한 역할을 수행함.
조건
1. 반드시 한 컬럼만 반환해야함
2. Nested Loop 방식으로 처리됨.
3. 실행되는 횟수는 row 수.
4. 반복되는 코드나 마스터 유형의 테이블을 조회하는 경우 사용하면 효율적.
Exists 구문을 이용하여 구현함.
Subquery 결과 존재하면 true, 없으면 false.
테이블에 하나 또는 여러개의 데이터 삽입.
테이블의 하나 또는 여러 line을 변경.
UPDATE <target> FROM <wa>.
UPDATE <target> FROM TABLE <itab>
테이블에 하나 또는 여러 line의 데이터를 삭제함.
UPDATE 구문과 INSERT 구문을 합한 기능을 수행함.
데이터가 테이블에 존재하면 UPDATE 하고, 없으면 INSERT를 수행한다.
OPEN SQL 은 DB종류에 상관없이 모든 오브젝트 조회 가능.
NATIVE SQL은 DB 종류에 따라 사용할 수 있는 SQL 구문 다름.
EXEC SQL .
<NATIVE SQL statement>
ENDEXEC
PERFORMING 구문을 사용하여 한 번에 여러개의 데이터를 Internal Table에 삽입할 수 있음.
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은 오라클 테이블에 대한 별명을 의미함.
SQL구문은 DB서버에서 Application서버로 데이터양을 최소화하여 전송하도록 구성해야 함.
ABAP 프로그램에서는 Fetch Size를 설정할 수 없음. 오라클에서 설정된 Fetch Size를 기본으로 이용하게 됨.
추가
SELECT * 지양
필요한 컬럼만 명시하면 네트워크 왕복량 줄고 성능↑
FOR ALL ENTRIES
내부 테이블 itab 기준으로 한 번에 조회
Native SQL 최소화하기