본문 바로가기

ABAP 프로그래밍 개념/OPEN SQL

3. Selecting Data from Database Tables

Internal Table을 사용하여 데이터베이스 테이블에서 가져온 데이터를 처리하고 한 번에 여러 행의 데이터를 저장할 수 있습니다. 이 섹션에서는 데이터베이스에서 가져온 데이터를 처리하는 데 사용할 수 있는 몇 가지 Open SQL 문을 살펴볼 것입니다.

SELECT 키워드는 데이터베이스 테이블에서 데이터를 가져옵니다. 단일 레코드나 여러 레코드를 선택할 수 있으며, 가져온 데이터를 ABAP 프로그램에서 선언한 Structure나 Internal Table에 어디에 넣을지 선택할 수 있습니다. 데이터베이스 테이블의 모든 필드를 완전히 선택하거나 특정 필드만 선택하여 가져올 수 있습니다.

더보기

* UNION Addition

SAP NetWeaver 7.5 부터, UNION addtion을 통해 두 개의 SELECT 문의 결과 집합 사이에 UNION을 생성할 수 있습니다.

데이터베이스에서 데이터를 가져올 때 Data Object의 행은 데이터베이스 테이블의 행과 동일해야 합니다. 이를 보장하기 위해서는 전체 행을 선택할 때 Data Object를 테이블에 참조해야 합니다. 만약 특정 필드만 선택해야 하는 경우, 선택할 필드를 선택할 순서대로 정의해야 합니다. SELECT 문은 필드의 순서가 데이터 객체의 순서와 일치하지 않는 경우 INTO CORRESPONDING FIELDS 추가 구문을 지원합니다.

아래 코드는 SELECT SINGLE 문을 사용하여 데이터베이스 테이블에서 단일 행을 선택하는 방법을 보여줍니다. WHERE 절을 만족하는 행이 하나 이상인 경우, 첫 번째 일치하는 행을 가져옵니다.

TYPES: BEGIN OF ty_vbrk,
        VBELN TYPE VBELN_VF, "Document Number"
        FKDAT TYPE FKDAT, "Bill Date"
        NETWR TYPE NETWR, "Net Value"
        KUNRG TYPE KUNRG, "Payer"
       END OF ty_vbrk.
       
DATA : it_vbrk TYPE STANDARD TABLE OF ty_vbrk,
       wa_vbrk TYPE ty_vbrk.
       
*VBRK에서 특정필드들에 대하여 하나의 Row만 SELECT
SELECT SINGLE vbeln fkdat netwr kunrg 
  FROM vbrk
  INTO wa_vbrk
  WHERE vbeln EQ '9000'.

 

아래 예시는 SELECT ... ENDSELECT를 사용하여 일치하는 모든 행을 한 번에 하나씩 가져오는 방법을 보여줍니다. 시스템은 SELECT ... ENDSELECT 사이를 반복하며, 데이터베이스의 데이터를 하나의 행씩 Sturcture wa_vbrk로 전송합니다.

ENDSELECT 전에 구문을 작성하여 각 루프에서 wa_vbrk의 데이터를 처리할 수 있습니다. 이는 프로그램 실행 중 데이터베이스 테이블을 한 번만 사용할 계획이라면 레코드를 처리하는 효율적인 방법입니다.

그러나 프로그램 실행 중 데이터를 여러 번 재사용할 계획이라면, 동일한 데이터를 필요할 때마다 데이터베이스에 접근하여 가져오는 대신 데이터를 한 번에 프로그램으로 가져와 이후에 여러 번 액세스할 수 있는 Internal Table을 사용하는 것이 좋습니다. 이 방법은 데이터베이스에 대한 액세스를 줄이고 프로그램의 실행 속도를 높일 수 있습니다.

"조건에 맞는 모든 데이터를 Structure를 사용하여 Select"
*시스템은 한번에 한 Line의 데이터를 가져오고 Select ~ EndSelect의 루프안에서 데이터를 계속 가져온다

SELECT vbeln fkdat netwr kunrg FROM vbrk
  INTO wa_vbrk
 WHERE vbeln EQ '9000'.

ENDSELECT.

아래 예시는 SELECT 구문에서 Internal Table을 사용하는 것을 보여주고, 조건에 맞는 모든 데이터를 데이터베이스에서 한번에 인터널 테이블에 담는 array fetch를 수행합니다. SELECT 구문이 실행하고난 뒤에, 이전에 논의한대로 Internal Table의 데이터에 접근하는 것이 가능합니다.

"조건에 맞는 VBRK의 데이터를 한번에 다수의 Row를 Internal Table에 SELECT 하기"
SELECT vbeln fkdat netwr kunrg 
  FROM vbrk
  INTO TABLE it_vbrk
  WHERE vbeln EQ '9000'.

아래 구문은 테이블 행의 전체 필드를 선택하는 것을 보여줍니다. 데이터 객체 선언과 SELECT 문에서 *를 사용하는 것 사이에서의 차이점을 알아볼 수 있습니다

DATA : it_vbrk TYPE STANDARD TABLE OF vbrk,
       wa_vbrk TYPE vbrk.

*VBRK의 모든 필드에 대해 한 Row(행)만 SELECT
SELECT SINGLE * 
  FROM vbrk
  INTO wa_vbrk
  WHERE vbeln EQ '9000'.

*Structure을 사용하여 조건에 맞는 모든 VBRK의 데이터를 SELECT

SELECT * 
  FROM vbrk
  INTO wa_vbrk
  WHERE vbeln EQ '9000'.
ENDSELECT.

*조건에 맞는 모든 VBRK의 데이터를 Internal Table에 담기

SELECT * 
  FROM vbrk
  INTO TABLE it_vbrk
  WHERE vbeln EQ '9000'.

 

반응형