Oracle PL/SQL 강좌
파라미터가 있는 커서(Cursors with Parameters) 8 17 99,999+

by 구루비 CURSORS WITH PARAMETERS EXPLICIT CURSOR PL/SQL CURSOR [2002.01.20]


  커서가 OPEN되고 질의가 실행되면 매개 변수 값을 커서에 전달할 수 있다. 다른 active set을 원할때 마다 explicit 커서를 따로 선언해야 한다.

파라미터가 있는 커서 문법

파라미터가 있는 커서 예제

 
SQL> CREATE OR REPLACE PROCEDURE ParamCursor_Test
        (param_deptno   emp.deptno%TYPE) 
     IS

        v_ename     emp.ename%TYPE;

        -- Parameter가 있는 커서의 선언
        CURSOR emp_list(v_deptno emp.deptno%TYPE) IS
        SELECT ename 
        FROM emp
        WHERE deptno = v_deptno;

     BEGIN

        DBMS_OUTPUT.ENABLE;
        DBMS_OUTPUT.PUT_LINE(' ****** 입력한 부서에 해당하는 사람들 ****** ');              

        -- Parameter변수의 값을 전달(OPEN될 때 값을 전달한다)
        FOR emplst IN emp_list(param_deptno) LOOP    

          DBMS_OUTPUT.PUT_LINE('이름 : ' || emplst.ename);

        END LOOP;    

        EXCEPTION  
          WHEN OTHERS THEN
             DBMS_OUTPUT.PUT_LINE('ERR MESSAGE : ' || SQLERRM);         

     END; 
     /

--DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용
SQL> SET SERVEROUTPUT ON ; 

-- 실행 결과
SQL> EXECUTE ParamCursor_Test(10);
****** 입력한 부서에 해당하는 사람들 ******
이름 : CLARK
이름 : KING
이름 : MILLER
    

- 강좌 URL : http://www.gurubee.net/lecture/1067

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

by 노비스 [2005.03.16 13:01:24]
왜 파라미터 있는 커서가 필요한 것일까요?
무척 궁금하네여. 왜 필요한 것일까? 왜?

파라미터있는 커서가 예제로는 필요없어도 될 것 같은데... 무척 궁금해요.

by 마루 [2005.04.08 12:38:10]
음..그러게요..
프로시저에서 선언해준 param_deptno를 커서안에서 사용하면 안되나요??
어차피 커서에서 선언해준 v_deptno가
결국 param_deptno를 받는거 아닌가요?
왜 따로 선언해서 받는거져?

by 야마 [2005.04.11 15:04:52]
그 이유는 만일 조건만 틀린 동일한 쿼리를 매번 커서를 선언해서 사용하면
재사용측면에서 소스가 지저분해지겠져.
글구 커서를 여러개 선언해서 사용하는 것보다 한번만 선언해서 변수만
대입해서 쓰면 성능에도 도움이 되구 소스도 간결해지겠져.
길게 커서를 선언하지 않아도 되니깐여.
글구 다른 DBMS가 생각해 주지 않는 것을 ORACLE에서는 세세하게
프로그래밍적으로 다룰 수 있다는 것이져.

by 초이 [2006.06.23 14:28:39]
파라미터 값에 따라 조건절에 대입되는 값이 달라질경우.. 파라미터가 있는 커서가 유용하더군요. 제가 작성한 예로는 날짜를 입력 받으면 해당날짜에 지정된 범위를 다시 구해서 그것으로 커서를 완성하는데.. 아주 유용하게 사용했습니다.

by My1over [2007.03.22 10:39:31]
위에 분들 말씀은..

CURSOR emp_list IS
SELECT ename
FROM emp
WHERE deptno = param_deptno;
...
FOR emplst IN emp_list LOOP

처럼 파라메터 없는 커서로 구현하면 안되냐는 말씀 같은데요..
외부의 변수나 파라메터를 커서의 SELECT문 안에서는 사용할 수 없는 건가요?

by 왕초보 [2007.08.09 18:05:33]
v_ename emp.ename%TYPE;

이부분은 왜 선언한거지용???;;

by 디스타임 [2007.11.09 16:07:06]
내용은 이해가 가지만 PL/SQL을 어디에 응용하여 적용하는지가 문제겠네요
머리가 좋아야 되겠네..저처럼 머리 안좋은 넘은 밥상을 차려줘도
밥까지 퍼서 달라는 식이져 --;

by 김윤경 [2007.11.12 16:05:06]
v_ename emp.ename%TYPE; 이 부분은 정말 쓰이는데가 없네요...
저도 아직 왜 사용하는지는 잘 모르겠네요.
잘 봐뒀다 나중에 더 학습해야겠어요.

by 무리 [2008.04.30 00:32:57]
v_ename emp.ename%TYPE; 는 심심풀이 땅콩이라고나 할까.

by 궁금 [2008.06.27 13:28:41]
WHERE deptno in ( param_deptno) ;

param_deptno 안에는 여러개의 데이타 값이 있구요
이렇게 사용하는 방법은 없는지요?

by 이재영 [2010.03.06 20:22:45]
제 생각에는 파라미터가 있는 변수를 쓰는 이유가 이런거 같네요.
프로시저실행할때 넘기는 변수가 아닌 프로시저 안에서 select된 값에 의해 커서의 조건이 달라질경우 사용하는듯합니다. 그때 유용할듯하네요.

by red [2010.09.02 17:01:01]
중첩 for 문 사용 할때 보통 쓰는데
for c1
select b from a where a = a;
for c2(b)

loop
loop
보기에 편함.

by ㅇㅇ [2011.08.12 18:08:38]
v_ename emp.ename%TYPE; 은 굳이 필요없는거 같구
파라미터 커서의 경우 다른 프로시져로 부터 넘겨받는 데이터가 있는경우
그 데이터를 근거로 커서를 만들어야 할 필요가 있을때 쓰는거..
위의 예처럼 예로 30번 부서의 직원을 뽑아내는 커서를 만들때 쓰는거 겠지요 ㅋ

by 우와 [2011.12.27 17:23:38]
2005년에 글적은 내용가지고 아직도.... 그이야길 하는군요

제가봐두 v_ename emp.ename%TYPE; 왜 쓰는지 모르겟는데요.

지금의 노비스 님이나 지금의 마루님이라면 이유를 알지 싶은데요. 6년이란 내공을

더 쌓앗으니까요

by 입문 [2012.01.26 16:58:46]
어렵네요ㅜㅜ 다시봐도ㅜㅜ

by 마숑 [2013.06.18 21:29:29]

커서안에 커서를 불러올때 사용하게되네요

감사합니다.

v_ename emp.ename%TYPE;

이건 v_ename  변수를 설정해주려면 써야하지안나요?


by 상유니 [2015.08.12 22:38:26]

역시 오라클은 재밌어

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