* 강한 타입의 REF CURSOR
리턴 타입을 선언한다.
1. 선언
TPYE [커서이름] IS REF CURSOR RETURN [테이블 레코드];
2. 예문
DECLARE
TYPE TYPE_R IS RECORD(
NAME EMP.ENAME%TYPE,
SAL EMP.SAL%TYPE); /* 리턴되는 레코드 타입을 선언한다. */
TYPE TYPE_C IS REF CURSOR RETURN TYPE_R;/* TYPE_R로 리턴되는 커서타입 선언*/
R1 TYPE_R; /* 레코드를 선언한다. */
C1 TYPE_C; /* 커서를 선언한다. */
BEGIN
OPEN C1 FOR /* 커서를 열고 FOR뒤에 SQL문을 입력한다. */
SELECT ENAME, SAL FROM EMP
WHERE SAL > 1000;
LOOP /* 출력을 위한 루프문 */
EXIT WHEN C1%NOTFOUND;
FETCH C1 INTO R1; /* 래코드에 패치하고 출력한다. */
DBMS_OUTPUT.PUT_LINE(R1.NAME || '/' || R1.SAL);
END LOOP;
END;
/
* 약한 타입의 REFCURSOR
리턴 타입을 선언하지 않는다.
1. 선언
TPYE [커서이름] IS REF CURSOR;
2. 예문
DECLARE
TYPE REF_C IS REF CURSOR; /* 커서타입을 선언하고 바로 커서를 선언한다. */
C1 REF_C;
TYPE REC_T IS RECORD( /* 2가지 타입의 레코드를 선언한다. */
ID NUMBER,
COL VARCHAR2(30)
);
TYPE REC_T2 IS RECORD(
ID NUMBER,
COL VARCHAR2(15),
COL2 VARCHAR2(15)
);
R1 REC_T; /* 컬럼이2개 */
R2 REC_T2; /* 컬럼이 3개 */
SELECTION VARCHAR2(1) := UPPER(SUBSTR('&ab',1,1)); /* 사용자의 입력을 받는다 */
BEGIN
IF SELECTION = 'A' THEN /* A를 입력하면 첫번째 타입의 레코드 결과값이 나온다. */
OPEN C1 FOR
SELECT EMPNO, SAL FROM EMP;
DBMS_OUTPUT.PUT_LINE('연봉출력');
LOOP
EXIT WHEN C1%NOTFOUND;
FETCH C1 INTO R1;
DBMS_OUTPUT.PUT_LINE(R1.ID || '/' || R1.COL);
END LOOP;
ELSIF SELECTION = 'B' THEN /* B를 입력하면 두번째 타입의 레코드 결과값이 나온다. */
OPEN C1 FOR
SELECT EMPNO, ENAME, SAL FROM EMP;
DBMS_OUTPUT.PUT_LINE(' 이름,연봉 출력');
LOOP
EXIT WHEN C1%NOTFOUND;
FETCH C1 INTO R2;
DBMS_OUTPUT.PUT_LINE(R2.ID || '/' || R2.COL || '/' || R2.COL2);
END LOOP;
ELSE /* 잘못입력시 정보를 제공한다. */
DBMS_OUTPUT.PUT_LINE('A또는B를 입력하여 주세요!!');
RETURN;
END IF;
END;
/