SooBlending

[Oracle] PL/SQL 커서 (Cursor) 본문

Programming/DataBase

[Oracle] PL/SQL 커서 (Cursor)

블랜더 2017. 11. 13. 11:36

<커서> Cursor

- select의 결과가 2개행 이상일 때 명시적으로 사용.

  형식)

     declare

       -- 변수선언, 커서정의

       CURSOR 커서명 IS select문장;

     begin

       OPEN 커서명;

         FETCH 커서명 INTO 변수명; -- 데이터 1행 인출

       CLOSE 커서명;

     end;

     /


-------------------------------------------------     

  declare

     -- 변수선언, 커서선언(정의)

   

     CURSOR cur is select deptno, dname, loc from dept; 

     vdept dept%rowtype; -- vdept타입으로 deptno,dname,loc컬럼을 참조하겠다!!

                         -- vdept는 dept와 같다!!

     

   begin

     OPEN cur;

     

     dbms_output.put_line('부서번호/부서명/부서위치');

     dbms_output.put_line('===============================');

     

     loop

       FETCH cur into vdept; -- deptno, dname, loc

          exit when cur%notfound; -- 커서를 통해 인출된 행이 없다면

        dbms_output.put_line(vdept.deptno ||'  /  '||

                             vdept.dname || '  /  '|| vdept.loc);

      

     end loop; 

      

     CLOSE cur; 

   end;

   /


-----------------------------------------------------------------

문제) 특정 부서에 있는 사원의 사원번호, 사원명, 급여, 입사일을 출력하시는 프로시저를 작성하시오.

 ----> 프로시저명: dept_member

 

 create or replace procedure dept_member(vdeptno  emp.deptno%type) 

 is

   -- 변수선언, 커서선언

   CURSOR cur

   is

   select empno, ename, sal, to_char(hiredate,'yyyy-mm-dd') hiredate

   from emp

   where deptno=vdeptno;

   

   cnt number := 0;

   su number;

      

 begin

   dbms_output.put_line('=========<'||vdeptno||'번부서>==========');

   dbms_output.put_line('사원번호/사원명/급여/입사입');

   dbms_output.put_line('----------------------------------');   

   --커서에 for문을 적용 : open,close 생략하는 것이 가능

   --for 변수명 in 최소값..최대값

   --for i in 1..6

   for vemp in cur -- 자동 open, fetch, close

                   -- vemp: 결과 한 행을 저장하는 변수

   loop

     dbms_output.put_line(vemp.empno || '/'|| vemp.ename|| '/'||

                          vemp.sal ||'/'|| vemp.hiredate);

     cnt := cnt+1;                          

   end loop;   

   

   dbms_output.put_line('---------------- 사원수: '||cnt||'명');

   

   select count(*) into su

   from emp

   where deptno=vdeptno;

   

   dbms_output.put_line('---------------- 사원수: '||su||'명');

 end;

 /

 

Comments