1. OPEN SQL Overview
- OPEN SQL은 R/3 시스템에서 사용되며 데이터베이스 데이터를 조회하고 변경하는 등의 기능을 수행한다.
- 데이터베이스 시스템(Oracle, MSSQL 등)에 관계없이 SQL결과와 Error Message가 반환된다.
- ABAP Dictionary에서 생성된 테이블, 뷰에만 적용되며, Cluster, Pooled 테이블에서 제한된 기능만 수행가능.
- OPEN SQL은 기본적으로 클라이언트에 종속적이다.
<OPEN SQL 명령어>
Keyword | 기능 |
SELECT | 데이터베이스 테이블에서 데이터를 읽음 |
INSERT | 데이터베이스 테이블에서 데이터를 추가함 |
UPDATE | 데이터베이스 테이블의 값을 변경함 |
MODIFY | INSERT+ UPDATE의 기능을 수행함 UPDATE : 동일한 KEY 값이 있는 경우 INSERT : 동일한 KEY 값이 존재하지 않는 경우 |
DELETE | 데이터베이스 테이블의 값을 삭제함 |
2. OPEN SQL : 데이터 읽기
<Reading Data 명령어>
구문 | 기능 |
SELECT <result> | SELECT구문은 조회하고자 하는 테이블 필드명을 나열할 수 있으며, 한 건 또는 여러 라인을 조회할 수 있음. |
INTO <target> | SELECT에서 읽어온 데이터를 변수에 저장하며, 이 변수를 ABAP 프로그램에서 사용함. |
FROM <source> | FROM 구문은 SELECT 할 테이블을 지정해준다. 위치는 INTO 이전/이후 모두 둘 수 있다. |
WHERE <cond> | 조회하고자 하는 데이터의 조건을 추가할 수 있다. |
GROUP BY <fields> | 여러 라인의 결과를 그룹으로 지정하여 하나의 결과를 얻을 수 있다. 예를 들어, 그룹별 합계를 구할 경우 GROUP BY 를 사용 |
HAVING <cond> | HAVING은 GROUP의 조건을 설정하는 WHERE 구문이다. |
ORDER BY <fields> | 조회된 데이터를 정렬한다. |
2.1) SELECT 구문
① SIngle Line
Single 구문을 사용하면 데이터를 한 건만 가져오기 때문에 원하는 데이터의 조건을 정확하게 알고 있어야 한다.
즉, WHERE 조건에 유일한 Key값이 추가되어야 하는 데 만약에 WHERE 구문이 잘못되어 여러 개의 라인을
읽어오면 임의의 라인을 반환한다.
SELECT SINGLE <cols> ...WHERE
② Several Lines
여러 라인을 조회할 떄는 SELECT 결과가 내부 테이블에 저장된다.
이것을 ABAP에서는 인터널 테이블(ABAP 메모리에 생성되는 데이터를 저장할 수 있는 가상의 테이블)이라 부른다.
DISTINCT를 사용하게 되면, 중복된 값을 제외한다.
SELECT [DISTINCT] <cols>...WHERE
INTO 구문의 결과가 저장되는 곳이 인터널 테이블이 아니라 필드 또는 Work Area(구조체)일 때에는
마지막에 ENDSELECT를 사용하여야한다.
아래 구문은 하나의 값을 읽어서 구조에 삽입하고, 조건에 해당하는 값을 모두 읽어 올 때 까지 LOOP를 수행한다.
SELECT [DISTINCT] <cols>...WHERE...
...
ENDSELECT.
③ AS(Alias)
AS 구문을 사용하여, 칼럼 명에 별명을 지정할 수 있다.
④ 동적인 SELECT 구문
SELECT 구문의 칼럼을 동적으로 선언할 수 있다.
동적 구문을 저장하는 구조체는 최대 72자까지 가능하면 CHAR 타입이어야 한다.
2.2) INTO 구문
SELECT구문에서 조회한 결과값을 변수(Target Area)에 저장하는 기능을 수행한다.
① 구조체(Work Area)
여러 칼럼의 한 라인만 조회하고자 할 경우에는 Work Area(변수, 구조체)에 값을 할당한다.
CORRESPONDING FIELDS OF 구문을 사용하면 한 번에 Work area의 동일 필드명에 값을 할당한다.
② Internal Table
여러 라인을 조회할 경우에는 인터널 테이블을 사용한다.
APPENDING은 인터널 테이블에 추가로 INSERT하고,
INTO는 인터널 테이블의 데이터를 삭제한 다음 INSERT 한다.
PACKAGE SIZE는 인터널 테이블에 몇 개의 라인을 추가할 것인가를 설정한다.
만약 PACKAGE SIZE 5라고 설정하면 5개의 값을 여러 번 읽어와 인터널 테이블에 추가하게 된다.
이 경우에는 ENDSELECT 구문을 반드시 사용해야 한다.
SELECT...INTO | APPENDING [CORRESPONDING FIELDS OF]TABLE <itab> [PACKAGE SIZE <n>]...
예시) SELECT INTO CORRESPONDING FIELDS OF TABLE itab
PACKAGE SIZE 5
FROM SPFLI.
ENDSELECT.
③ SIngle Field
테이블의 개별 칼럼을 조회하거나 Aggregate(집계) 함수를 사용할 떄에는 아래 구문과 같이 사용해야한다.
SELECT...INTO (f1, f2,...)...
INTO 구문 다음에 두 개 이상의 Target이 필요한 경우에는 괄호와 변수명을 붙여써야한다.
공백이 존재하면 Syntax Error가 발생한다.
SELECT carrid connid INTO (gv_carri,gv_connid) FROM sflight.
2.3) FROM 구문
FROM 구문은 데이터를 SELECT 할 대상 테이블(또는 뷰)을 지정한다.
FROM 구문 다음에는 하나의 테이블을 지정하거나 여러 개의 테이블을 JOIN 할 수 있다.
Alias를 사용하여 테이블 명에 별명을 붙일 수 있으며, 테이블 이름을 동적으로 선언할 수 있다.
FROM 구문은 Table을 정의하는 부분과 데이터베이스 접근을 컨트롤하는 부분(option)으로 나누어진다.
구문 | 설명 |
CLIENT SPECIFIED | 자동 client 설정을 해제한다. |
BYPASSING BUFFER | SAP Local Buffer에서 값을 읽지 않는다. 테이블이 Buffering이 설정되어 있더라도 바로 데이터베이스 테이블에서 SELECT를 수행한다. |
UP TO n ROWS | SELECT의 row 개수를 제한한다. 조회 조건에 날짜를 입력하지 않는 것과 같은 사용자 실수로 대량의 데이터를 요청할 때 데이터베이스 성능 저하를 예방할 수 있다. |
① 정적인 TABLE 선택
하나의 테이블을 정적으로 선언할 때 사용한다.
Alias를 사용할 수 있으며 이 경우에는 테이블 명을 SELECT 구문에서 사용할 수 없다.
SELECT... FROM <dbtab> [AS <alias>] <options>
② 동적인 TABLE 선택
테이블 이름을 동적으로 선언하여 사용할 수 있다.
이 때 테이블 이름은 반드시 대문자로 지정해야하며, ABAP Dictionary에 존재하는 이름이어야한다.
③ JOIN 구문
관계형 데이터베이스에서 여러 개의 테이블 값ㅇ르 동시에 읽어 올 경우 JOIN을 사용하게 된다.
일반적으로 Primary Key(PK)와 Foreign Key(FK)를 사용하여 JOIN하는 경우가 대부분이지만
떄로는 논리적인 값들의 연관으로 JOIN 하는 경우도 있다.
두 테이블 간의 연결 조건은 ON 구문을 사용하고 JOIN에 사용되는 필드가 인덱스에 존재할 때
빠른 성능이 보장된다.
SELECT ...FROM <tab> [INNER] JOIN <dbtab> [AS <alias>] ON <cond> <options>...
④ INNER JOIN과 OUTER JOIN
JOIN 종류에는 크게 (INNER) JOIN과 OUTER JOIN 두 가지가 있으며
OUTER JOIN은 INNER JOIN 하고 다른 것을 추가로 보여주려면 필요하다
ABAP OPEN SQL에서는 LEFT OUTER JOIN만 사용할 수 있다.
이것은 JOIN 연결의 왼쪽에 있는 데이터를 기준으로 SELECT 결과가 도출된다.
⑤ LIne 수 제한
아래 구문을 이용하여 테이블에서 읽어오는 라인 수를 제한한다.
SELECT... FROM <tab> UP TO <n> ROWS...
이 Line 수 제한은 보통 리포트 프로그램의 조회 조건인 SELECTION SCREEN에서 최대 적중 수를 제한하는 목적으로
많이 사용된다.
2.4) WHERE 구문
WHERE 조건은 SELECT 적중 수를 줄여 주고 사용자가 원하는 데이터를 정확하게 선택할 수 있도록 하는 조건이다.
WHERE 조건에 사용되는 필드가 인덱스에서 사용될 때 빠른 성능을 보장한다.
UPDATE, DELETE와 같은 명령어에도 사용된다.
<WHERE 구문에 사용되는 연산자>
연산자 | 의미 |
EQ | 같음 |
= | 같음 |
NE | 같지 않음 |
<> | 같지 않음 |
>< | 같지 않으 |
LT (Less Than) | 보다 작음 |
< | 보다 작음 |
LE | 작거나 같음 |
<= | 작거나 같음 |
GT | 보다 큼 |
> | 보다 큼 |
GE | 크거나 같음 |
>= | 크거나 같음 |
① Interval 조건
조건에 범위 값을 사용해야할 때 사용된다.
② String 비교
문자열을 비교할 때는 LIKE 구문을 사용한다.
만약 ABC로 시작하는 조건을 추가하게 된다면
SELECT~WHERE COL2 LIKE 'ABC%'. 이런 식으로 지정해준다.
③ LIST VALUE
IN 구문을 사용하여, 여러 조건에 속한 경우의 값을 가져온다.
예를 들면, '서울' ,'수원'에 거주하는 사람을 경우
WHERE 거주지 IN('서울','수원')과 같이 사용한다.
④ SELECTION TABLE
IN 구문을 사용하여 Selection Table, Range 변수에 존재하는 값들을 조회할 수 있다.
Selection Table, Range 변수는 인터널 테이블과 유사하게 여러 Row를 저장할 수 있는 변수이다.
⑤ DYNAMIC 조건(동적 조건)
SELECT 구문의 조건을 설정하는 WHERE 구문을 동적으로 구성할 수 있다.
⑥ FOR ALL ENTRIES 구문
FOR ALL ENTRIES 구문은 인터널 테이블과 데이터베이스의 테이블을 JOIN 하는 개념과 유사하며,
이것도 LOOP를 수행하면서 SQL을 수행한다.
데이터베이스 테이블간의 JOIN보다는 비효율적이지만 ABAP 언어에서 많은 경우에 유용하게 활용된다.
SELECT ...FOR ALL ENTRIES IN <itab> WHERE <cond>
2.5) GROUPING 구문
Aggregate(집계) 함수를 사용하려면 SELECT 구문에 GROUP BY를 기술해야 한다.
GROUP BY 구문은 테이블의 특정 칼럼에 같은 값들이 존재할
2.6) GROUPING 조건 : HAVING
HAVING 구문은 GROUP BY로 조회한 SELECT 구문에 그룹의 조건을 추가한다.
WHERE 조건에서처럼 동적 선언이 가능하다.
2.7) SORT 구문
SELECT 결과로 조회된 데이터가 ORDER BY에 기술된 칼럼 기준으로 정력된다.
ORDER BY를 사용하지 않으면, 임의로 정렬된 결과가 조회된다.
ORDER BY PRIMARY KEY
- 테이블의 KEY에 의해 정렬된다.
- SELECT * 구문인 경우에만 사용할 수 있다.
- JOIN 구문 및 VIEW에는 사용할 수 없다.
ORDER BY 구문에서는 AVG ( paymentsum ) 와 같은 Aggregate 함수를 사용할 수 없어서
SELECT 구문에서 as 명령어를 이용하여 'paymentsum' 과 같은 Alias 설정이 필요하다.
2.8) Subquery
서브쿼리는 SELECT 구문의 WHERE 조건에 또 다른 SELECT 구문을 추가하여 값을 제한하는 목적으로 사용된다.
① Scalar(스칼라) 서브쿼리
서브쿼리를 이용해 특별한 조건을 WHERE 구문에 추가할 수 있다.
Subquery의 SELECT 구문에는 칼럼 하나만 선언할 수 있다.
스칼라 서브쿼리의 정의
SELECT 절 안에 기술된 SELECT 절로 정의된다.
즉, 하나의 행으로부터 하나의 칼럼 값(또는 Aggregate 함수)을 반환하는 Subquery로서,
JOIN 구문과 유사한 역할을 수행한다.
스칼라 서브쿼리의 이해
1) Scalar subquery는 반드시 한 칼럼만을 반환해야 한다.
2) Scalar subquery는 Nested Loop 방식으로 처리된다
3) Scalar subquery는 실행되는 횟수는 Row 수이다.
4) 반복되는 코드나 마스터 유형의 테이블을 조회하는 경우 사용하면 효율적이다..
② Non-scalar Subquery
Subquery의 결과가 존재하면 TRUE를 반환하며, 존재하지 않으면 FALSE를 반환한다.
EXISTS 구문을 이용하여 구현한다.
'Easy Abap 2.0' 카테고리의 다른 글
[3주차] Chapter 12 Report Program Part1 (1) | 2023.11.27 |
---|---|
[3주차] Chapter 3 OPEN SQL & NATIVE SQL PART3 (0) | 2023.11.22 |
[3주차] Chapter 3 OPEN SQL & NATIVE SQL PART1 (0) | 2023.11.21 |
[2주차] Chapter 5 Internal Table Part 3 (1) | 2023.11.21 |
[2주차] Chapter 5 Internal Table Part 2 (0) | 2023.11.16 |