메뉴 건너뛰기

SAP 한국 커뮤니티

[ABAP] Dynamic SQL ( UPDATE/DELETE clause,Rel4.10 )

문바이 2011.11.18 15:45 조회 수 : 665

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

 

Dynamic Open SQL.

내역 : UPDATE/DELETE절을 이용한 동적처리
---------------------------------------------------------------------
사전지식 :  Oracle Native SQL사용가능( 집합함수를 사용할 줄 안다.)
---------------------------------------------------------------------

문법 : Rel6.10 이전 방식임

      명령   동적처리부분       FROM work_area
      DELETE ( <table_clause> ) FROM <fs_wa>.
      UPDATE ( <table_clause> ) FROM <fs_wa>.
      단점 : <fs_wa>를 통해서 update/delete되어야 하기 때문에 <fs_wa>를 명시적으로 사용하는데 한계가 있다.
            이를 해결하기 위해 Rel6.10부터는 동적 UPDATE/DELETE 구문을 보다 상세히 제에할수 있게 하였다.

생각 : 본문의 주석을 잘 읽어 볼것.

 

프로그램 원문

---------------------------------------------------------------------

REPORT   YTEST_DYNAMIC_OPEN_SQL04.

types: begin of key,
         mandt  type sflight-mandt,
         carrid type sflight-carrid,
         connid type sflight-connid,
       end of key.

data: lt_tabnames type table of tabname,
      lv_dref type ref to data.

field-symbols: <fs_tabname> type tabname,
               <fs_wa>      type any,
               <fs_key>     type key.

"3개의 Table을 대상으로 작업할 것이다.(작업대상을 추가한다)
append 'SFLIGHT' to lt_tabnames.
append 'SPFLI'   to lt_tabnames.
append 'SBOOK'   to lt_tabnames.

"작업대상을 기준으로 최외곽 Loop를 돌린다.
loop at lt_tabnames assigning <fs_tabname>.

  "lv_dref를 table명으로 구조체를 만든다
  create data lv_dref type (<fs_tabname>).

  "만들어진 구조체를 가공하기 위한 Field Symbol에 역참조 시킨다.
  assign lv_dref->* to <fs_wa>.

  "실질적으로 가공할수 있는 <fs_wa>에서 Primary값을 명시적으로 변경하기위해 <fs_key>에 casting한다
  assign <fs_wa> to <fs_key> casting.

  "선택된 Table중 where carrid = 'LH' and connid = '0455'인 항목으로 Loop를 형상한다
  select * from (<fs_tabname>) into <fs_wa>
    where carrid = 'LH' and connid = '0455'.

    "키값을 변경하기 때문에 Update는 사용할수 없다.
    "따라서 기존 데이타를 삭제한후 키값을 변경하여
    DELETE (<fs_tabname>) from <fs_wa>.
    <fs_key>-carrid = 'UA'.
    <fs_key>-connid = '3505'.
    "데이타를 추가한다.
    INSERT (<fs_tabname>) from <fs_wa>.

  endselect.


endloop.