-
[Open SQL & Native SQL] Native SQLSAP/Abap 2022. 1. 14. 15:03
[Native SQL]
DB의 종류에 상관없이 실행이 가능한 Open SQL과는 달리 Native SQL은 DB에 종속적이고, 자주 사용되지 않지만, Open SQL로는 불가능한 복잡한 SQL구문을 사용할 수 있다.
- 장점
- Abap dictionary에 생성된 테이블을 포함한 모든 테이블에 접근이 가능하다.
- Open SQL: Abap dictionary에 생성된 테이블에만 접근이 가능하다.
- Database에 의존적인 SQL구문이므로 Open SQL에 비해 정밀한 SQL 작업이 가능하다.
- Abap dictionary에 생성된 테이블을 포함한 모든 테이블에 접근이 가능하다.
- 단점
- EXEC ~ ENDEXEC 사이 구문점검(Syntax Check)이 수행되지 않아 dump error가 발생할 수 있다.
- DB환경에 종속적이기에 다른 DB를 사용하는 환경에는 적용이 불가능하다.
- Client를 구분하는 mandt 필드를 SQL구문내에 반드시 포함해야 한다.
1) 기본구문
EXEC SQL . <NATIVE SQL statement> ENDEXEC.
- 변수명 앞에 콜론(:) 기호를 추가해야 한다.
- WHERE(조건) 구문 내에 클라이언트 구분자, 즉 MANDT 필드를 반드시 기술해야 한다.
- 미기술시, 인덱스활용이 불가능해 테이블 full-scan으로인해 성능이 저하된다.
REPORT ZA03_21. DATA : gv_carrid LIKE sflight-carrid VALUE 'AA', gv_connid LIKE sflight-connid. EXEC SQL. SELECT a.connid INTO :gv_connid FROM sflight a WHERE a.mandt = :sy-mandt AND a.carrid = :gv_carrid ENDEXEC. WRITE :/ gv_connid.
2) Native SQL + Internal table
- PERFORMING 구문을 통해 여러개의 데이터를 internal table에 한번에 삽입할 수 있다.
- PERFORMING구문: SELECT문이 한번 실행될때마다 특정 Subroutine을 실행
EXEC SQL PERFORMING <form> <NATIVE SQL statement> ENDEXEC.
REPORT ZA03_22. TYPES : BEGIN OF t_str, carrid TYPE sflight-carrid, connid TYPE sflight-connid, END OF t_str. DATA : gt_itab TYPE TABLE OF t_str, gs_wa TYPE t_str, gv_carrid LIKE sflight-carrid VALUE 'AA'. EXEC SQL PERFORMING append_itab. SELECT A.CARRID, A.CONNID INTO :GS_WA-CARRID, :GS_WA-CONNID FROM SFLIGHT A WHERE A.MANDT = :SY-MANDT AND A.CARRID = :GV_CARRID ENDEXEC. FORM append_itab. WRITE :/ gs_wa-carrid, gs_wa-connid. APPEND gs_wa TO gt_itab. CLEAR gt_itab. ENDFORM.
3) Native SQL + JOIN
REPORT ZA03_23. TYPES : BEGIN OF t_str, carrid TYPE sflight-carrid, connid TYPE sflight-connid, carrname TYPE scarr-carrname, END OF t_str. DATA : gs_wa TYPE t_str, gv_carrid LIKE sflight-carrid VALUE 'AA'. EXEC SQL PERFORMING WRITE_DATA. SELECT A.CARRID, B.CARRNAME INTO :GS_WA-CARRID, :GS_WA-CARRNAME FROM SFLIGHT A, SCARR B WHERE A.MANDT = B.MANDT AND A.CARRID = B.CARRID AND A.MANDT = :SY-MANDT AND A.CARRID = :GV_CARRID ENDEXEC. FORM write_data. WRITE :/ gs_wa-carrid, gs_wa-carrname. ENDFORM.
- OUTER JOIN
EXEC SQL PERFORMING WRITE_DATA. SELECT A.CARRID, B.CARRNAME INTO :GS_WA-CARRID, :GS_WA-CARRNAME FROM SFLIGHT A, SCARR B WHERE A.MANDT(+) = B.MANDT AND A.CARRID(+) = B.CARRID AND A.MANDT = :SY-MANDT AND A.CARRID = :GV_CARRID ENDEXEC.
4) Native SQL + SUBSTRING
- gv_char 문자열의 3번째 문자부터 길이 2만큼 추출
- Abap의 Length&Offset이용: gv_char+2(2) => 인덱스(2) == 3번째 문자
- Oracle DB의 SUBSTR이용: SUBSTR(gv_char, 3, 2)
REPORT ZA03_24. DATA : gs_wa TYPE sflight, gv_carrname TYPE scarr-carrname, gv_carrid TYPE sflight-carrid VALUE 'AA'. EXEC SQL PERFORMING WRITE_DATA. SELECT A.CARRID, SUBSTR(B.CARRNAME, 1, 8) INTO :GS_WA-CARRID, :GV_CARRNAME FROM SFLIGHT A, SCARR B WHERE A.MANDT = B.MANDT AND A.CARRID = B.CARRID AND A.MANDT = :SY-MANDT AND A.CARRID = :GV_CARRID ENDEXEC. FORM write_data. WRITE :/ gs_wa-carrid, gs_wa-connid, gv_carrname. ENDFORM.
5) Native SQL 실행 툴
- [T-code: ST04] => Diagnostics => SQL Editor
'SAP > Abap' 카테고리의 다른 글
[Modularization] Function (0) 2022.01.18 [Modularization] Subroutine (0) 2022.01.17 [Open SQL & Native SQL] SQL else (0) 2022.01.14 [Open SQL & Native SQL] INSERT & UPDATE & DELETE & MODIFY (0) 2022.01.14 [Open SQL & Native SQL] SELECT (0) 2022.01.12 - 장점