[ABAP] OPEN SQL, NATIVE SQL / OPEN SQL 데이터 읽기 - SELECT, INTO, FROM
🌝 OPEN SQL vs. NATIVE SQL
🌜 OPEN SQL
-
ABAP 언어에서만 사용
-
Data Interface를 통해 NATIVE SQL(데이터베이스에서 사용되는 SQL 언어)로 번역됨
-
DML 언어만 사용 가능
-
DML : Data Manipulation Language (데이터 처리 언어)
-
SELECT, UPDATE, INSERT, DELETE
-
-
Local Buffer를 사용할 수 있음
-
ABAP 프로그램을 활성화할 때 자동으로 Syntax Check가 수행됨
🌜 NATIVE SQL
-
데이터베이스에 직접 접속해 DML, DDL 언어 사용 가능
-
DDL : Data Definition Language (데이터 정의어)
-
CREATE, ALTER, DOP, TRUNCATE
-
-
OPEN SQL의 Command Set(SELECT, UPDATE, DELETE, ..)을 사용할 수 있음
🌜 Local Buffer
-
SAP Local Buffer는 R/3 Architecture에서 지원하는 기술로서 데이터베이스의 부하를 줄이는 중요한 역할을 담당
- Local Buffer란? 각 장치마다 제어하기 위해 설치된 장치 컨트롤러에 장치로부터 들어오고 나가는 데이터를 임시로 저장하기 위한 작은 메모리
-
테이블의 Technical Setting에서 Buffer를 사용한다고 설정해야 함
🌝 OPEN SQL : 데이터 읽기 - SELECT
🌜 Single Line
-
데이터베이스에서 하나의 라인 값을 읽어올 때
SINGLE
사용 -
하나의 데이터만 가져오기 때문에 WHERE 조건에 유일한 킷값이 추가되어야 하는데, WHERE 구문이 잘못 되어 여러 개의 라인을 읽어온다면 임의의 라인을 반환
🌜 Several Line
-
여러 라인을 조회할 때는 SELECT 결과가 내부 테이블에 저장되는데, ABAP에서는 이것을 인터널 테이블(Internal Table)이라 부른다.
-
INTO
구문의 결과가 저장되는 곳이 인터널 테이블이 아닌 필드 또는 Work Area일 때에는 마지막에ENDSELECT
를 사용해야 함 -> 하나의 값을 읽어서 구조에 삽입, 조건에 해당하는 값을 모두 읽어 올 떄까지 LOOP를 수행INTO
: SELECT에서 읽어온 데이터를 변수에 저장, 이 변수를 ABAP 프로그램에서 사용
-
ex)
REPORT ZTEST. DATA : GT_ITAB TYPE STANDARD TABLE OF SFLIGHT, GS_WA TYPE SFLIGHT. SELECT * INTO TABLE GT_ITAB FROM SFLIGHT WHERE CARRID EQ 'AA'. LOOP AT GT_ITAB INTO GS_WA. WRITE : /GS_WA-CARRID, GS_WA-CONNID. ENDLOOP.
🌝 OPEN SQL : 데이터 읽기 - INTO
- SELECT 구문에서 조회한 결괏값을 변수(Target Area)에 저장하는 기능을 수행
🌜 Work Area
-
여러 컬럼의 한 라인만 조회하고자 할 경우 Work Area에 값을 할당
-
CORRESPONDING FIELDS OF
구문 사용 시 한 번에 Work Area의 동일 필드명에 값 할당
🌜 Internal Table
-
여러 라인을 조회하는 경우 인터널 테이블을 사용
-
APPENDING
은 인터널 테이블에 추가로 INSERT /INTO
는 인터널 테이블의 데이터 삭제 후 INSERT -
PACKAGE SIZE
: 인터널 테이블에 몇 개의 라인을 추가할 것인가를 설정, 이 경우 ENDSELECT 구문을 반드시 사용해야 함
🌝 OPEN SQL : 데이터 읽기 - FROM
-
FROM 구문은 데이터를 SELECT 할 대상 테이블(or 뷰)를 지정
-
FROM 구문에서 사용 가능한 Option
-
` CLIENT SPECIFIED` : 자동 client 설정 해제
-
BYPASSING BUFFER
: SAP Local Buffer에서 값을 읽지 않음, 테이블이 Buffering 설정되어 있더라도 바로 데이터베이스 테이블에서 SELECT 수행 -
UP TO n ROWS
: SELECT의 row 개서 제한, 사용자 실수로 대량의 데이터를 요청할 때 데이터베이스 성능 저하를 예방할 수 있음
-
-
정적/동적으로 TABLE 선언 가능
-
정적으로 테이블을 선언할 때는 Alias를 사용할 수 있으며, 이 경우 테이블 명을 SELECT 구문에서 사용할 수 없다.
-
동적으로 테이블을 선언할 때는 테이블 이름을 반드시 대문자로 지정해야 하며, ABAP Dictionary에 존재하는 이름이어야 한다.
-
🌜 JOIN
-
JOIN에 사용되는 필드가 인덱스에 존재할 때 빠른 성능이 보장됨
-
ABAP OPEN SQL에는 INNER JOIN과 LEFT OUTER JOIN만 사용 가능
-
ex)
REPORT ZTEST. TYPES : BEGIN OF t_str, carrid TYPE sflight-carrid, carrname TYPE scarr-carrname, END OF t_str. DATA : gs_str TYPE t_str. SELECT SINGLE a~carrid b~carrname INTO CORRESPONDING FIELDS OF gs_str FROM sflight AS a INNER JOIN scarr AS b ON a~carrid EQ b~carrid WHERE a~carrid = 'AA'. WRITE : gs_str-carrid, gs_str-carrname.