커서를 연속으로 사용할 수 없나요? 0 2 2,415

by 아야세 [PL/SQL] oracle cursor [2022.02.24 16:26:03]


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;

이렇게 하고 싶습니다.

이유는 첫번째 커서에서 테이블에 저장을 하고, 두번째 커서에서는 첫번째 커서에서 저장한 테이블을 불러서 처리할 작업이 있어서 그렇습니다.

어떻게 해야 커서를 연속으로 사용할 수 있을까요?

by 마농 [2022.02.24 16:53:05]

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 강좌
 

-- 현행 : 개별 블럭 --
DECLARE
    CURSOR dt_cur  IS ...;
BEGIN
    -- 처리1 --
END;
/
DECLARE
    CURSOR dt_cur1 IS ...;
BEGIN
    -- 처리2 --
END;
/
-- 개선 1안 : 단일 블럭 --
DECLARE
    CURSOR dt_cur  IS ...;
    CURSOR dt_cur1 IS ...;
BEGIN
    -- 처리1 --
    -- 처리2 --
END;
/
-- 개선 2안 : 서브 블럭--
BEGIN
    DECLARE
        CURSOR dt_cur  IS ...;
    BEGIN
        -- 처리1 --
    END;
    DECLARE
        CURSOR dt_cur1 IS ...;
    BEGIN
        -- 처리2 --
    END;
END;
/

 


by 아야세 [2022.02.24 16:54:57]

감사합니다.

공부좀 해야겠어요 ㅠ.ㅠ

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입