참고 : http://blog.kjslab.com/20


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

DECLARE

  CURSOR C1 IS
    SELECT TABLE_NAME
         , TABLESPACE_NAME
         , STATUS
         , PCT_FREE
      FROM USER_TABLES;

BEGIN

  FOR R IN C1 LOOP
    DBMS_OUTPUT.PUT_LINE('TABLE NAME : ' || R.TABLE_NAME || ', TABLESPACE NAME : ' || R.TABLESPACE_NAME);
  END LOOP;END;


-- ROW 단위로 변수 정의

DECLARE
  R USER_TABLES%ROWTYPE;
  C1 SYS_REFCURSOR;

BEGIN
  OPEN C1 FOR
   SELECT *
      FROM USER_TABLES;

    LOOP
        FETCH C1 INTO R;
        EXIT WHEN C1%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE('TABLE NAME : ' || R.TABLE_NAME);
    END LOOP;
   
    CLOSE C1;

END;
/


-- ROW 단위로 변수 정의 후 COLUMN 단위로 사용

DECLARE
    R USER_TABLES%ROWTYPE;
    C1 SYS_REFCURSOR;

BEGIN
  OPEN C1 FOR
   SELECT TABLE_NAME
        , TABLESPACE_NAME
      FROM USER_TABLES;

    LOOP
        FETCH C1 INTO R.TABLE_NAME, R.TABLESPACE_NAME;
        EXIT WHEN C1%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE('TABLE NAME : ' || R.TABLE_NAME || ', TABLESPACE NAME : ' || R.TABLESPACE_NAME);
    END LOOP;
    
    CLOSE C1;

END;



-- COLUMN 단위로 변수 정의

DECLARE
  TABLE_NAME USER_TABLES.TABLE_NAME%TYPE;
  C1 SYS_REFCURSOR;
 
BEGIN
  OPEN C1 FOR
   SELECT TABLE_NAME
      FROM USER_TABLES;

     
    LOOP
        FETCH C1 INTO TABLE_NAME;
        EXIT WHEN C1%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE('TABLE NAME : ' || TABLE_NAME);
    END LOOP;
    
    CLOSE C1;

END;


-- TYPE 정의

DECLARE
    TYPE V_TYPE IS RECORD (TABLE_NAME USER_TABLES.TABLE_NAME%TYPE, TABLESPACE_NAME USER_TABLES.TABLESPACE_NAME%TYPE);
    R V_TYPE;
    C1 SYS_REFCURSOR;


BEGIN
  OPEN C1 FOR
   SELECT TABLE_NAME
        , TABLESPACE_NAME
      FROM USER_TABLES;

    LOOP
        FETCH C1 INTO R;
        EXIT WHEN C1%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE('TABLE NAME : ' || R.TABLE_NAME || ', TABLESPACE NAME : ' || R.TABLESPACE_NAME);
    END LOOP;

   
    CLOSE C1;

END;




2. 커서 변수를 미리 만들어 놓고 불러서 사용하는 방법

DECLARE
   R USER_TABLES%ROWTYPE;
   C1 SYS_REFCURSOR;

BEGIN
   OPEN C1 FOR
      SELECT *
        FROM USER_TABLES;

   LOOP                                                            
      FETCH C1 INTO R;
      EXIT WHEN C1%NOTFOUND;
      DBMS_OUTPUT.PUT_LINE('TABLE NAME : ' || R.TABLE_NAME || ', TABLESPACE NAME : ' || R.TABLESPACE_NAME);
   END LOOP;

   CLOSE C1;
END;
/



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

BEGIN
   FOR C1 IN (
    SELECT TABLE_NAME
         , TABLESPACE_NAME
      FROM USER_TABLES
   )
   LOOP
      DBMS_OUTPUT.PUT_LINE('TABLE NAME : ' || C1.TABLE_NAME || ', TABLESPACE NAME : ' || C1.TABLESPACE_NAME);
   END LOOP;
END;





+ Recent posts