커서의 내용을 미리 정의 해 놓고 사용하는 방법.

DECLARE
  CURSOR C_LIST IS
    SELECT MY_ID FROM MY_TABLE WHERE 조건;
BEGIN

  FOR I_ID IN C_LIST LOOP
    DBMS_OUTPUT.put_line(I_ID);
  END LOOP;
END;
비추천 

커서의 내용을 정할 때 select 문제 동적으로 parameter가 넘어가야 할 경우 사용이 불가능 하다. 왜냐하면 BEGIN 전에 정의하기 때문이다.



커서 변수를 미리 만들어 놓고 불러서 사용하는 방법.
DECLARE
	I_ID   VARCHAR2(100);		-- 변수 정의				
  C_LIST SYS_REFCURSOR;		-- 커서 정의
BEGIN
  OPEN C_LIST FOR
  SELECT MY_ID   
    FROM MY_TABLE
    WHERE 조건;
  LOOP					-- LOOP 돌기.
      FETCH C_LIST
      INTO  I_ID;			--  하나씩 변수에 넣기.
      EXIT WHEN C_LIST%NOTFOUND;	-- 더이상 없으면 끝내기.
      DBMS_OUTPUT.put_line(I_ID);    --  출력
  END LOOP;
  CLOSE C_LIST;
END;
재사용성이 있어서 나름 괜찮음. 
커서를 정의 한 뒤 그 때 그 때 커서의 내용을 채우는 방법이다.




동적으로 커서를 생성해서 사용하는 방법
DECLARE

BEGIN

  FOR C_LIST IN (SELECT MY_ID FROM MY_TABLE WHERE 조건) 
  LOOP
    DBMS_OUTPUT.put_line(C_LIST.I_ID);
  END LOOP;
END;
강추~!!

커서를 미리 정의 할 필요도 없고, 변수를 미리 만들어 놓을 필요도 없다.




  1. 연잎 2013.06.20 11:14 신고

    세번째 방법 진짜 편하네요 ㅜㅜㅜㅜㅜㅜ 고맙습니다

  2. 나그네 2014.11.12 02:29

    자바와 비교하자면..
    FOR 변수 IN 1...맥스값 LOOP ~ END LOOP : 자바의 for(int 변수 = 1 ; 변수 <= 맥스값 ; 변수++) { } 와 동일
    FOR 변수 IN (Select 문) or 커서 LOOP ~ END LOOP : 자바의 for(Map 변수 : (Select 한 리스트)) { } 와 동일
    LOOP ~ END LOOP : 자바의 while(조건){ } 와 동일 -> 조건이 없거나(자바에서는 에러나겠지만) 항상 거짓이면 무한 루프 ㄷㄷㄷ...

    그리고 첫번째 방법은 아래와 같은 방법으로도 가능합니다.

    DECLARE
    CURSOR C_LIST IS
    SELECT MY_ID FROM MY_TABLE WHERE 조건;
    BEGIN
    OPEN C_LIST; -- 커서 열기.
    LOOP -- LOOP 돌기.
    FETCH C_LIST INTO I_ID;
    -- 하나씩 변수에 넣기.
    EXIT WHEN C_LIST%NOTFOUND; -- 더이상 없으면 끝내기.
    DBMS_OUTPUT.put_line(I_ID); -- 출력
    END LOOP;
    CLOSE C_LIST;
    END;

    위 방식은 일반적으로 오라클 커서로 검색하면 열에 아홉은 나오는 방식이죠.. 주로 DB 마이그레이션(Oralce -> Oralce(테이블 구조 다름))할때나 쓴다는..
    그리고 첫번째 방법처럼 For안에 커서를 넣을 수도 있군요..(마지막 방법은 다른거 검색하다가 최근에 알게된 방법이고요..)

  3. 나그네 2014.11.12 03:01

    첫번째 방법 FOR 문 일반 커서는 되는데 SYS_REFCURSOR는 안되네요..

  4. 현~~ 2016.09.02 13:42

    세번째ᆢ잘 사용하고 있습니다~~
    감사합니다

+ Recent posts