1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | DECLARE DT VARCHAR2(8); LVL INT ; CURSOR DT_CUR IS SELECT DT AS DT , LEVEL - 1 LVL FROM DUAL CONNECT BY LEVEL <= 7; BEGIN OPEN DT_CUR; LOOP FETCH DT_CUR INTO DT, LVL; EXIT WHEN DT_CUR %NOTFOUND; .......(실행내용) END LOOP; CLOSE DT_CUR; END ; DECLARE CURSOR DT_CUR1 IS SELECT TO_CHAR(TO_DATE( '20220215' , 'YYYYMMDD' ) + LEVEL - 1, 'YYYYMMDD' ) AS DT , LEVEL - 1 LVL FROM DUAL CONNECT BY LEVEL <= 7; BEGIN OPEN DT_CUR1; LOOP FETCH DT_CUR1 INTO DT, LVL; EXIT WHEN DT_CUR1 %NOTFOUND; ......(실행내용) END LOOP; CLOSE DT_CUR1; END ; |
이렇게 하고 싶습니다.
이유는 첫번째 커서에서 테이블에 저장을 하고, 두번째 커서에서는 첫번째 커서에서 저장한 테이블을 불러서 처리할 작업이 있어서 그렇습니다.
어떻게 해야 커서를 연속으로 사용할 수 있을까요?
PL/SQL 의 불럭 구조를 정확하게 이해하지 못하고 계신 듯 하네요.
지금 작성하신 것은 두개의 블럭이 별개로 실행되는 형태입니다.
(블럭1)(블럭2)
1안) 하나의 블럭 안에서 두개 처리를 실행하는 방안이 있고
2안) 하나의 메인 블럭을 사용하는 방안도 있습니다.
(메인블럭0 (서브블럭1) (서브블럭2) )
지난번 글에 달았던 참조 링크 다시 한번 달아 드립니다.
http://gurubee.net/lecture/1342 -- PL/SQL Block 의 구조
http://gurubee.net/oracle/plsql -- Oracle PL/SQL 강좌
1 2 3 4 5 6 7 8 9 10 11 12 13 | -- 현행 : 개별 블럭 -- DECLARE CURSOR dt_cur IS ...; BEGIN -- 처리1 -- END ; / DECLARE CURSOR dt_cur1 IS ...; BEGIN -- 처리2 -- END ; / |
1 2 3 4 5 6 7 8 9 | -- 개선 1안 : 단일 블럭 -- DECLARE CURSOR dt_cur IS ...; CURSOR dt_cur1 IS ...; BEGIN -- 처리1 -- -- 처리2 -- END ; / |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | -- 개선 2안 : 서브 블럭-- BEGIN DECLARE CURSOR dt_cur IS ...; BEGIN -- 처리1 -- END ; DECLARE CURSOR dt_cur1 IS ...; BEGIN -- 처리2 -- END ; END ; / |