바로투입이력카드
SAP 게시판

정보·팁

ABAP SQL ① 요즘 SELECT 문법: FIELDS, INTO, 호스트 변수

에이든ABAP 개발자운영자모듈 MMSD기타조회 2

3줄 요약

  • 요즘 SELECT 는 SELECT FROM 소스 FIELDS 칼럼 WHERE 조건 INTO 대상. 순서이고, INTO 는 맨 뒤에, 프로그램 변수에는 @ 를 붙여요.

  • 대상은 INTO TABLE @DATA(itab) 처럼 인라인으로 만들 수 있지만, 만들어지는 내부 테이블은 키가 비어 있는 표준 테이블이에요.

  • 칼럼 이름이 같은 필드끼리만 옮기고 싶으면 INTO CORRESPONDING FIELDS OF 를 써요. 안 쓰면 칼럼 이름이 아니라 위치로 채워져요.

어떤 상황에서 쓰나요

오래된 ABAP 프로그램의 SELECT ... INTO TABLE itab 에는 @ 가 없고, 새로 쓰는 코드에는 @DATA(...) 가 있어서 둘이 같은지 헷갈릴 수 있어요. 이 연재는 SAP 공식 ABAP 치트시트의 *ABAP SQL* 편을 정리해요. 첫 회는 SELECT 한 문장의 뼈대와 읽은 결과를 받는 방법이에요.

핵심 내용

뼈대. 치트시트가 보여 주는 기본 형태는 이래요. WHERE 는 선택이지만 결과를 줄이려면 쓰라고 권해요.

SELECT FROM source   " 어디서 읽나
  FIELDS field_list  " 어떤 칼럼을 읽나
  WHERE condition    " 어떤 행을 읽나
  INTO target.       " 어디에 담나

현대 문법의 특징 (치트시트의 "Notes on Modern SELECT Statements")

  • INTO 절은 다른 절 뒤에 둬요.

  • 호스트 변수나 식은 @ 나 @( ... ) 를 붙여요. 프로그램 변수와 DB 칼럼이 구분돼요. 엄격한 문법 검사 모드에서는 이 형태가 강제돼요.

  • SELECT 목록은 FIELDS 로 쓰거나, SELECT col1, col2 FROM ... 처럼 FROM 앞에 쓸 수 있어요. 둘은 같은 문장을 다르게 배치한 것뿐이에요.

  • 한 행만 읽으면 SELECT SINGLE, 아니면 여러 행 결과나 SELECT 루프예요.

`SELECT` 목록 쓰는 법

  • 전부: SELECT *

  • 여러 칼럼: col1, col2, col3

  • 소스 이름을 붙여서: dbtab~col1, dbtab~*

  • 별칭: col1 AS al1, 소스에도 FROM dbtab AS ds (별칭은 한 번만 쓸 수 있고, 문장 안에서는 주로 ORDER BY 뒤에서 써요)

  • 이름 충돌이 있으면 칼럼 선택자 ~ 를 쓰라는 안내도 나와요.

대상(target)

  • INTO TABLE @itab / INTO TABLE @DATA(itab_inl): 내부 테이블. 인라인으로 만들면 표준 테이블이고 키가 비어 있다는 점을 치트시트가 짚어요. 이후에 정렬이나 읽기를 할 때 기본 키가 비어 있다는 걸 기억해야 해요.

  • INTO @struc / INTO @DATA(struc_inl): 구조체(SELECT SINGLE 에서).

  • INTO CORRESPONDING FIELDS OF [TABLE]: 이름이 같은 칼럼만 옮겨요. 이 추가 구문 없이 이미 있는 대상에 읽으면 SELECT 목록의 칼럼이 왼쪽부터 순서대로 대상의 컴포넌트에 들어가고, 남는 컴포넌트는 변하지 않아서 원치 않는 결과가 나올 수 있어요. 기본 규칙은 이래요. 추가 구문이 없으면 칼럼 이름은 상관없고 위치만, 있으면 위치는 상관없고 이름만 봐요.

  • APPENDING [CORRESPONDING FIELDS OF] TABLE: INTO 는 대상을 초기화하지만 APPENDING 은 기존 줄을 남기고 덧붙여요.

  • INTO NEW @DATA(dref): 익명 데이터 객체(참조)로 받아요.

`FOR ALL ENTRIES` 대신. 치트시트는 이 추가 구문이 폐기 예정(deprecated)으로 간주된다고 말해요. 함정이 여럿 있어서예요. 표현식, GROUP BY, ORDER BY 같은 SQL 기능이 없고(정렬은 기본 키 칼럼만 가능), 결과에 암묵적인 DISTINCT 가 적용돼 중복 행이 자동으로 사라지며 데이터 문제를 가릴 수 있어요. 무엇보다 내부 테이블이 비어 있으면 `WHERE` 조건 전체가 무시되고 DB 테이블의 모든 행이 돌아와요. 그래서 오래된 코드에는 IF lines( cond_tab ) > 0. 같은 방어 코드가 붙어 있어요. 대신 내부 테이블을 소스로 쓰는 조인을 권해요.

SELECT DISTINCT schedule~carrid, schedule~connid
  FROM zdemo_abap_flsch AS schedule
  INNER JOIN @cond_tab AS condition
    ON schedule~carrid = condition~carrid
   AND schedule~connid = condition~connid
  INTO TABLE @DATA(itab_join).

주의할 점

  • 내부 테이블을 소스로 쓰는 조인(INNER JOIN @cond_tab)은 비교적 최근 문법이에요. 어느 릴리스부터인지는 치트시트에 적혀 있지 않아서, 내 시스템에서 문법 검사를 해 보세요.

  • 이 글의 @ 호스트 변수, 인라인 선언은 낮은 릴리스(예: ECC 6.0)에서는 쓸 수 없어요. 어느 릴리스부터인지 확인하세요.

  • 치트시트는 계속 갱신되는 문서예요. 첫 공개는 2022년이고, 제가 읽은 판은 2026년 10월 기준이에요. 이 글은 읽고 정리한 것이고 예제를 직접 실행해 보지는 않았어요.

원문 주소: https://github.com/SAP-samples/abap-cheat-sheets/blob/main/03_ABAP_SQL.md#read-operations-using-select

출처와 이용 안내
  • 원문: ABAP Cheat Sheets - ABAP SQL Read Operations Using SELECT · 작성자 SAP SE and contributors SAP-samples · 작성일 2022-12-05 · 기준 릴리스에 따라 다름 원문은 최신 ABAP 기준 · 확인일 2026-10-25

  • 이 글은 위 원문을 읽고 한국어로 요약·재구성한 글이며 번역본이 아니에요. 원문의 저작권은 작성자와 SAP에 있어요.

  • 원문은 Apache-2.0 라이선스(https://www.apache.org/licenses/LICENSE-2.0)로 공개된 자료예요. 이 글은 내용을 한국어로 줄이고 순서를 바꾼 변경본이며, 원저작자가 이 글을 보증하지 않아요.

  • 설정과 화면은 릴리스마다 달라요. 적용하기 전에 원문과 SAP Help Portal, 관련 SAP Note에서 최신 내용을 확인해 주세요.

  • SAP와 SAP 제품명은 SAP SE의 상표예요. 바로투입은 SAP와 관련이 없어요.

댓글 0

아직 댓글이 없어요.

정보·팁 목록전체 목록