자료 저장소

* 강한 타입의 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;
/

댓글 로드 중…

최근에 게시된 글