본문 바로가기

ORACLE/PL/SQL

파라미터가 있는 커서 정리

정상구문
===================================================================================================
CREATE OR REPLACE PROCEDURE ParamCursor_Test
        (param_deptno   emp.deptno%TYPE) 
     IS

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




파라미터가 없을 경우
===================================================================================================
CREATE OR REPLACE PROCEDURE ParamCursor_Test
        (param_deptno   emp.deptno%TYPE) 
     IS

     
        CURSOR emp_list IS
        SELECT ename 
        INTO param_deptno
FROM emp WHERE deptno = param_deptno;

     BEGIN

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

       
        FOR emplst IN emp_list LOOP    

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

        END LOOP;    

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

     END; 
===================================================================================================
이 경우
"PLS-00403: SELECT/FETCH 문에 'PARAM_DEPTNO' 식을 INTO 대상으로 사용될 수 없습니다"
에러가 발생한다. 

즉, 외부의 변수를 커서의 SELECT문 안에서는 사용할 수 없는거로 보임.
 
그렇기 때문에 따로 파라미터를 정의해줘서 전달함.