이글은 자료실에 있는 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.
좋은 정보 감사합니다. 잘 보고 갑니다.