오라클 커서 관련 질문입니다 0 3 463

by davis [Oracle 기초] 오라클 커서 프로시저 [2022.02.16 17:51:05]


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;

요렇게 두개만 쓰게요

기존 프로시저가 셀렉트되는 컬럼이 늘어날수도 있어서 그때마다 수정할수 없을것 같아서요 ㅠㅠ

by 마농 [2022.02.17 10:38:23]

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;
/


by davis [2022.02.17 15:00:22]

ORA-06550 'v_cursor'는 프로시저가 아니거나 정의되지 않았습니다

라고 뜨네요 ㅠㅠ


by 마농 [2022.02.22 10:07:47]
-- 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;
/

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입