메뉴 건너뛰기

SAP 한국 커뮤니티

[ABAP] Dynamic SQL ( FROM clause,Rel6.10, Join table )_맺음말

문바이 2011.11.18 15:52 조회 수 : 938

이글은 자료실에 있는 DynamicOpenSql 영문파일을 정리한 것이다.

 

Dynamic SQL은 Runtime에 사용가능한 Open SQL은 번역이 이루워진 후 DB를 제어하게 된다.

이때 DB를 선택하고나 가공하는 시간대비 번역에 걸리는 시간은 극히 미비하여 무시해도 될 정도이니

Dynamic SQL을 사용하면서 쿼리자체의 튜닝시간에 신경을 쓸지언정

Dynamic SQL을 사용함에 따른 시간은 생각하지 말자! 

 

Dynamic Open SQL.

내역 : FROM clause.

       (Rel6.10이후 버젼부터는 Join을 허용하므로 아래의 내용을 사용할 수 있다)

---------------------------------------------------------------------
사전지식 :  Oracle Native SQL사용가능( 집합함수를 사용할 줄 안다.)
            MS-SQL을 사용해본 사람이 유리하죠. JOIN명령 때문에
            Oracle을 사용하신 분은 join처음에 적응 안되죠..(+)게 익숙한데..
---------------------------------------------------------------------


문법 : SELECT * FROM (lv_tabname).
       FROM절에서 사용되는 table이름 단독으로 사용된다.
       inner join, outter join등은 허용되지 않는다.
       이 이야기는 결국 lv_tabname의 type이 internal table 필요가 없을음 알수있다

생각 : 본문의 코딩이 워낙 쉬어서 주석을 달지 않았음.

 

프로그램 원문.
--------------------------------------------------------------------*
REPORT   YTEST_DYNAMIC_OPEN_SQL06.

parameters: p_cities   as checkbox,
            p_carrie   as checkbox,
            p_seats    as checkbox,
            p_names    as checkbox.

data: begin of wa,
        carrid   type sbook-carrid,
        connid   type sbook-connid,
        fldate   type sbook-fldate,
        customid type sbook-customid,
        cityfrom type spfli-cityfrom,
        cityto   type spfli-cityto,
        carrname type scarr-carrname,
        seatsmax type sflight-seatsmax,
        seatsocc type sflight-seatsocc,
        name     type scustom-name,
      end of wa,
      lv_from type string value 'sbook as b',
      lv_list type string value 'b~carrid b~connid b~fldate b~customid'.

if p_cities = 'X'.
  concatenate
    lv_from ' join spfli as p on b~carrid = p~carrid and b~connid = p~connid'
    into lv_from.
  concatenate lv_list ' cityfrom cityto' into lv_list.
endif.

if p_carrie = 'X'.
  concatenate
    lv_from ' join scarr as c on b~carrid = c~carrid' into lv_from.
  concatenate lv_list ' c~carrname' into lv_list.
endif.

if p_seats = 'X'.
  concatenate
   lv_from ' join sflight as f'
  ' on b~carrid = f~carrid and b~connid = f~connid and b~fldate = f~fldate'
    into lv_from.
  concatenate lv_list ' seatsmax  seatsocc' into lv_list.
endif.

if p_names = 'X'.
  concatenate
    lv_from ' join scustom as u on b~customid = u~id' into lv_from.
  concatenate lv_list ' name' into lv_list.
endif.

select (lv_list) from (lv_from) into corresponding fields of wa.
  write: / wa-connid, wa-carrid, wa-fldate, wa-customid.
  if p_cities = 'X'.
    write: wa-cityfrom, wa-cityto.
  endif.
  if p_carrie = 'X'.
    write: wa-carrname.
  endif.
  if p_seats = 'X'.
    write: wa-seatsmax, wa-seatsocc.
  endif.
  if p_names = 'X'.
    write: wa-name.
  endif.
endselect.