DECLARE
v_cursor SYS_REFCURSOR;
v_col1 VARCHAR2(100);
v_col2 VARCHAR2(100);
BEGIN
test.pkg_p01.p01_list('abc', 'bcd', 'Y', v_cursor);
LOOP
FETCH v_cursor INTO v_col1, v_col2;
EXIT WHEN v_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_col1);
END LOOP;
CLOSE v_cursor;
END;
이런 구문이 있을때
호출하는 프로시저에서 셀렉트 되는 항목이 많을때 몇가지만 into로 쓸수도 있나요?
실제로 셀렉트는 v_col1~10까지 있더라도
FETCH v_cursor INTO v_col1, v_col2;
요렇게 두개만 쓰게요
기존 프로시저가 셀렉트되는 컬럼이 늘어날수도 있어서 그때마다 수정할수 없을것 같아서요 ㅠㅠ
DECLARE
v_cursor SYS_REFCURSOR;
BEGIN
test.pkg_p01.p01_list('abc', 'bcd', 'Y', v_cursor);
FOR c IN v_cursor LOOP
DBMS_OUTPUT.PUT_LINE(c.col1);
DBMS_OUTPUT.PUT_LINE(c.col2);
END LOOP;
CLOSE v_cursor;
END;
/
ORA-06550 'v_cursor'는 프로시저가 아니거나 정의되지 않았습니다
라고 뜨네요 ㅠㅠ
-- 1. 커서 리턴 프로시져 --
CREATE OR REPLACE PROCEDURE p_test
( p_deptno emp.deptno%TYPE
, p_cursor OUT SYS_REFCURSOR
)
IS
BEGIN
OPEN p_cursor FOR
SELECT *
FROM emp
WHERE deptno = p_deptno
;
END;
/
-- 2. 커서 반환 받아 처리 --
DECLARE
v_cursor SYS_REFCURSOR;
-- ROWTYPE 이나 RECORD TYPE 의 변수 사용 --
TYPE t_rec IS RECORD
( empno emp.empno %TYPE
, ename emp.ename %TYPE
, job emp.job %TYPE
, mgr emp.mgr %TYPE
, hiredate emp.hiredate%TYPE
, sal emp.sal %TYPE
, comm emp.comm %TYPE
, deptno emp.deptno %TYPE
);
-- v_rec emp%ROWTYPE; -- RowType
v_rec t_rec; -- Record Type
BEGIN
p_test(10, v_cursor);
LOOP
FETCH v_cursor INTO v_rec;
EXIT WHEN v_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_rec.ename);
END LOOP;
CLOSE v_cursor;
END;
/