IT기술/Oracle

17 PL/SQL Cursor (커서)

dobbby 2013. 11. 19. 13:38
반응형

1. SQL 커서란?

오라클 서버에서는 사용자의 SQL 문장을 처리하는 모든 서버 프로세스는 SQL 문을 실행할 때마다 처리를 위한 개별적인 메모리 공간을 사용한다.

커서란 이 개별 메모리 공간에 있는 데이터를 사람이 접근할 수 있도록 연결해주는 일종의 연결통로이며 포인터라고 부르기도 한다.

즉 사용자가 요청하는 데이터를 데이터베이스 버퍼 캐쉬에서 개별적인 메모리 공간(PGA)으로 복사해 온 후 커서를 통해서 원하는 데이터에 접근한 후 

필요한 데이터를 추출하여 PL/SQL 변수에 담고 후속 작업을 하게 된다는 뜻이다. 이 메모리 공간을 Private SQL Area 라고도 부르며,

오라클의 서버 프로세스 구성이 Dedicated Server 환경이냐 또는 MTS(Multi-Threaded Server) 환경이냐에 따라 서버 내에 위치되는 곳이 다르다.


SQL 커서는 크게 묵시적 커서와 명시적 커서로 나눌 수 있다.

묵시적 커서는 필요할 경우 오라클이 자동 선언하여 사용한 후 자동 정리한다.

PL/SQL 블록이 실행될 때 내부에 포함된 SQL 문장에 대해 SQL 커서가 자동적으로 생성된다.

즉, 사용자가 생성하지 않아도 자동생성된다는 의미이다.

명시적 커서는 사용자가 정의한 커서를 선언하여 사용하고, 커서의 사용이 끝난뒤에 별도의 작업을 수행해주어야 한다.



2. 묵시적 커서 (Implicit Cursor)

묵시적 커서는 오라클에서 자동적으로 선언해주는 SQL 커서로서, 사용자 입장에서는 생성 유무를 알 수 없다.

기본적으로 PL/SQL 블록 내에서의 SELECT 문, DML (INSERT, UPDATE, DELETE) 문이 실행될 때마다

묵시적 커서가 선언된다. 세션 내에 단 한개만 이 선언되어 사용되다가 문장이 종료됨과 동시에 정리된다.

묵시적 커서에 저장되는 데이터는 1행만 가능하고 여러 행을 저장해서 작업해야 할 경우에는 

명시적 커서를 사용해야 한다.


묵시적 커서 속성 (Cursor Attribute)

SQL%ROWCOUNT

해당 커서에서 실행한 총 행의 개수 (가장 마지막 행이 몇번째 행인지 카운트) 를 반환


SQL%FOUND

해당 커서 안에 아직 수행해야 할 데이터가 있을 경우 TRUE 값을 반환하고 없을 경우 FALSE 값을 반환하는 속성


SQL%NOTFOUND

해당 커서 안에 수행해야 할 데이터가 없을 경우 TRUE 값을 반환하고 있을 경우 FALSE 값을 반환


SQL%ISOPEN

묵시적 커서가 메모리에 OPEN 되어 있을 경우에 TRUE 값을, 그렇지 않을 경우 FALSE 값을 가지는 속성


묵시적 커서 사용 예1.

SELECT     sal

FROM        emp

ORDER BY 1 ;


SET SERVEROUTPUT ON;


DECLARE

BEGIN

DELETE    emp

WHERE    sal < 1000 ;

DBMS_OUTPUT.PUT_LINE ('-----------------------------------------------') ;

DBMS_OUTPUT.PUT_LINE ('1000 이하 : '||sql%rowcount||' 건 삭제되었습니다.') ;


DELETE    emp

WHERE    sal BETWEEN 1000 AND 2000;

DBMS_OUTPUT.PUT_LINE ('-----------------------------------------------') ;

DBMS_OUTPUT.PUT_LINE ('1000 ~ 2000 사이 : '||sql%rowcount||' 건 삭제되었습니다.') ;

END ;

/



묵시적 커서와 CURSOR FOR LOOP 문 활용하기


DECLARE

BEGIN

DBMS_OUTPUT.PUT_LINE('학과명과 학과의 위치 안내입니다.') ;

DBMS_OUTPUT.PUT_LINE('-------------------------------') ;

FOR depart_cur IN (

SELECT    dname, build

FROM        department

WHERE        build IS NOT NULL

ORDER BY 1

)

LOOP

DBMS_OUTPUT.PUT_LINE(depart_cur.dname||' ---> '||depart_cur.build||' 에 있습니다') ;

END LOOP ;

END ;

/

학과명과 학과의 위치 안내입니다.

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

기계공학과 ---> 기계실험관 에 있습니다

멀티미디어공학과 ---> 멀티미디어관 에 있습니다

문헌정보학과 ---> 인문관 에 있습니다

소프트웨어공학과 ---> 소프트웨어관 에 있습니다

전자공학과 ---> 전자제어관 에 있습니다

컴퓨터공학과 ---> 정보관 에 있습니다

화학공학과 ---> 화학실습관 에 있습니다



3. 명시적 커서 (Explicit Cursor)

명시적 커서는 사용자가 선언하여 생성 후 사용하는 SQL 커서로, 주로 여러개의 행을 처리하고자 할 경우 사용한다.

만약 여러 건을 검색하는 SELECT 문장의 경우 묵시적 커서를 사용할 경우 오라클은 예외사항을 (TOO_MANY_ROWS) 을 발생하게 된다.

명시적 커서는 묵시적 커서와는 다르게 동시에 여러 개가 선언되어 사용될 수 있다.


명시적 커서 속성 (Cursor Attribute)

커서이름%ROWCOUNT

FETCH 문에 의해 읽혀진 데이터의 총 행수를 가지는 속성이다. 가장 마지막에 처리된 행이 몇번째인지를 반환해준다.


커서이름%FOUND

FETCH 문이 수행되었을 경우, 읽혀진 행이 있을 경우에는 TRUE, 그렇지 않을 경우 FALSE 값을 가지는 속성


커서이름%NOTFOUND

FETCH 문이 수행되었을 경우, 읽혀진 행이 없을 경우 TRUE, 그렇지 않을 경우 FALSE 값을 가지는 속성


커서이름%ISOPEN

명시적 커서가 메모리에 확보되어 있을 경우 TRUE, 그렇지 않을 경우 FALSE 값을 가지는 속성



4. 명시적 커서 (Explicit Cursor) 처리 단계

1 명시적 커서 선언                CURSOR c_name

2 명시적 커서 오픈                OPEN c_name

3 커서에서 데이터 추출          Fetch c_name

4 커서 사용 종료                   CLOSE c_name


1) 명시적 커서 선언 (Declaration)

명시적 커서는 다른 변수와 마찬가지로 PL/SQL 의 선언부에 선언되어야 하며, 실제 메모리 할당이 이루어지는 것은 아니다.


문법

CURSOR 커서명

IS

커서에 담고 싶은 내용을 가져오는 서브쿼리


커서명: 명시적 커서의 이름으로 유일하게 명명되어야 한다.

서브쿼리: 기본적으로 명시적 커서는 여러 건을 검색하는 SELECT 문을 처리하기 위한 것이므로

처리하고자 하는 데이터를 검색하는 SELECT 문장을 이 부분에 기술한다.


2) 명시적 커서 열기 (Open)

커서 선언시 기술했던 서브쿼리를 수행해서 데이터를 커서로 가져온다는 뜻이다.

메모리에 실제 커서가 사용할 메모리 공간이 할당된다.

명시적 커서 영역에 자리잡은 데이터의 첫번째 행에 커서 포인터가 설정되고 바로 이 포인터 위치의

데이터행을 다음 단계인 FETCH에서 읽게 되는 것이다.


문법

OPEN 커서 이름 ;


커서이름 : 열고자 하는 명시적 커서의 이름


3) 명시적 커서로부터 데이터 읽어서 변수로 할당하기 (Fetch)

명시적 커서의 데이터들로부터 데이터를 한건씩 변수로 할당하기 위해 FETCH문을 사용한다.

이 때 읽게 되는 데이터 행은 포인터에 의해서 지정되며 한 행이 FETCH 되면 자동적으로 포인터는 다음 행으로 이동하게 된다.

일반적으로 명시적 커서에는 데이터가 여러건 들어있기 때문에 많은 데이터들을 읽어 처리하기 위해

FETCH 문은 반복문과 함께 사용하는 경우가 많다.

FETCH 문도 INTO 절을 사용한다.


문법

FETCH 커서이름 INTO 변수들 ;


커서이름: 읽어오고자하는 명시적 커서의 이름으로 반드시 OPEN 되어 있어야 FETCH가 가능하다.


변수들: 명시적 커서로부터 읽어온  데이터 행을 PL/SQL 블록 내에서 처리하기 위해서는 변수에 저장해서 사용한다.

이 때 VARIABLE 에는 앞에서 살펴본 단순변수와 복합변수가 올 수 있으며, 당연히 선언부에 선언된 변수만 올 수 있다.

만약 단순변수를 사용한다면, 커서에서 정의된 SELECT 리스트의 개수만큼 선언하고 SELECT 리스트의 위치대로 FETCH 의 INTO 절에

차례대로 적어야 한다. 복합 변수를 사용한다면, 커서 레코드 변수를 선언하여 사용한다.



4) 명시적 커서 닫기 (Close)

명시적 커서의 정리 (CLEAN-UP) 작업을 하는 명령으로, 명시적 커서가 사용된 후에는 반드시 '닫기'를 해야 한다.

커서를 닫는다 는 뜻은 작업이 끝난 메모리 공간을 반환하고 정리한다는 뜻이며 닫기를 하지 않게 되면

메모리가 낭비되고 만약 동일한 커서를 다른 PL/SQL BLOCK 에서 동일한 이름의 커서를 사용할 경우 에러가 생기게 된다.


문법

CLOSE 커서이름 ;


닫고자 하는 명시적 커서의 이름으로 CLOSE 된 명시적 커서는 더 이상 사용하지 않는다.

만약 PL/SQL 블록 내에서 CLOSE 된 커서를 접근하게 되면 오라클은 예외 (INVALID_CURSOR) 를 발생하게 된다.


명시적 커서 선언 및 사용 예:

DECLARE

vempno number(4) ;

vename varchar2(20) ;

vsal number(7) ;


/*

c1 이라는 이름의 명시적 커서를 선언한 부분,

이 커서가 open될 때 마치 view 처럼 서브쿼리가 수행된다.

*/


CURSOR c1 IS

SELECT    empno, ename, sal       

FROM    emp

WHERE    deptno = 20 ;


BEGIN

-- 커서 OPEN

OPEN c1 ;


DBMS_OUTPUT.PUT_LINE('번호 이름 급여') ;


LOOP

-- 커서에 있는 데이터를 FETCH해서 변수로 할당

FETCH c1 INTO vempno, vename, vsal ;

EXIT WHEN c1%NOTFOUND ;

DBMS_OUTPUT.PUT_LINE (vempno||' '||vename||' '||vsal) ;

END LOOP ;

-- 커서 CLOSE

CLOSE c1 ;

END ; 

/

번호 이름 급여

7566 JONES 2975

7788 SCOTT 3000

7902 FORD 5000



5. 명시적 커서와 Cursor FOR Loop 문 활용하기

일반적으로 명시적 커서는 여러건의 데이터가 들어있어 여러번 FETCH 를 수행하게 되고 그러기 위해 반복문을 사용하게 된다.

그 중 가장 많이 사용하는 것이 FOR 문인데  PL/SQL 에서는 FOR 반복문과 커서를 결합하여 CURSOR FOR 반복 기능을 제공한다.

이 방법을 사용할 경우 커서변수의 선언, 커서 열기, 커서내의 레코드 자동적으로 읽기, 커서 닫기 작업을 오라클이 자동으로 수행하게 된다.

즉, 사용자가 별도의 변수선언, OPEN, FETCH, CLOSE 문을 수행하지 않아도 됨을 의미한다.

반복횟수는 당연히 명시적 커서의 전체 행수만큼 수행된다.


문법

FOR record_name IN cursor_name LOOP

-- 명시적 커서의 OPEN, FETCH가 자동으로 수행됨

statement1 ;

statement2 ;

...

END LOOP ; -- 루프문을 빠져 나갈 때 자동적으로 커서가 CLOSE 됨.


record_name : 커서로부터 FETCH 된 하나의 레코드를 저장하기 위한 커서 레코드 변수로,

자동으로 만들어진다. 커서 변수는 복합변수  RECORD 처럼 사용되며 레코드를 구성하는 필드를 접근할 때는

레코드 변수명을 접두어로 사용한다.


cursor_name : 처리하고자하는 명시적 커서명으로, 선언부에서 정의되어야 한다.

FOR 문이 실행되면 IN 다음에 기술된 명시적 커서가 자동적으로 열어지며,

한 건씩 FETCH 가 되며, 커서 영역에 데이터가 모두 처리되면 루프를 종료하게 되고 

이 때 자동적으로 명시적 커서는 CLOSE 된다.


명시적 CURSOR 와 CURSOR FOR LOOP 예1.

DECLARE


CURSOR emp_cur IS        -- 커서 선언

SELECT    empno, ename

FROM        emp ;


BEGIN

FOR emp_rec IN emp_cur        -- 커서의 데이터를 저장할 emp_rec 변수 선언됨

LOOP

DBMS_OUTPUT.PUT_LINE(emp_rec.empno||' '||emp_rec.ename) ;

END LOOP ;

END ;

/


명시적 CURSOR 와 CURSOR FOR LOOP 예2.

DECLARE

vemp emp%ROWTYPE ;


CURSOR c1 IS

SELECT    empno, ename, sal

FROM        emp ;


BEGIN

FOR vemp IN c1 LOOP

EXIT WHEN c1%NOTFOUND ;

DBMS_OUTPUT.PUT_LINE(vemp.empno||' '||vemp.ename||' '||vemp.sal) ;

END LOOP ;

END ;

/


FOR 문에 사용될 RECORD 형의 변수를 사용자가 직접 선언한 후 CURSOR 속성을 사용해 LOOP 를 수행하여 결과를 출력하는 것을 보여준다.



명시적 CURSOR 와 CURSOR FOR LOOP 예2.

DECLARE

BEGIN

FOR emp_rec IN (

SELECT    empno, ename, sal

FROM       emp

)

LOOP

DBMS_OUTPUT.PUT_LINE(emp_rec.empno||' '||emp_rec.ename||' '||emp_rec.sal) ;

END LOOP ;

END ;

/


이번 예는 서브 쿼리를 사용하여 작업하는 예이다.

DELCARE 에 선언할 필요 없이 커서에 들어가는 서브 쿼리 부분을 IN 뒷부분에 사용하는 방법



6. 파라미터 Explicit Cursor

명시적 커서를 선언한 후 OPEN 할 때 값을 바꾸어서 수행해야 할 경우가 종종 있다.

이 때 커서를 OPEN 할 대 값만 파라미터로 전달해서 반복 수행할 수 있는 편리한 방법이 파라미터 커서이다.


문법

CURSOR cursor_name

[(parameter_name datatype, ...)]

IS

select-statement ;


parameter_name 파라미터 변수명으로 변수선언과 동일하며 여러개의 파라미터를 지정할 수 있다.


사용예1.

DECLARE

CURSOR prof_cur (v_deptno in number) IS    

SELECT    *

FROM        professor

WHERE        deptno = v_deptno ;

v_prof professor %ROWTYPE ;

BEGIN

DBMS_OUTPUT.PUT_LINE('================================') ;

DBMS_OUTPUT.PUT_LINE('101번학과 교수님 번호와 이름 출력') ;

DBMS_OUTPUT.PUT_LINE('================================') ;

OPEN prof_cur (101) ;

LOOP

FETCH prof_cur INTO v_prof ;

EXIT WHEN prof_cur%NOTFOUND ;

DBMS_OUTPUT.PUT_LINE(v_prof.profno||' 번 교수님 이름은 '||v_prof.name||'입니다') ;

END LOOP ;

CLOSE prof_cur ;


DBMS_OUTPUT.PUT_LINE('================================') ;

DBMS_OUTPUT.PUT_LINE('102번학과 교수님 번호와 이름 출력') ;

DBMS_OUTPUT.PUT_LINE('================================') ;

OPEN prof_cur (102) ;

LOOP

FETCH prof_cur INTO v_prof ;

EXIT WHEN prof_cur%NOTFOUND ;

DBMS_OUTPUT.PUT_LINE(v_prof.profno||' 번 교수님 이름은 '||v_prof.name||'입니다') ;

END LOOP ;

CLOSE prof_cur ;

END ;

/

================================

101번학과 교수님 번호와 이름 출력

================================

1001 번 교수님 이름은 조인형입니다

1002 번 교수님 이름은 박승곤입니다

1003 번 교수님 이름은 송도권입니다

5000 번 교수님 이름은 나교수입니다

================================

102번학과 교수님 번호와 이름 출력

================================

2001 번 교수님 이름은 양선희입니다

2002 번 교수님 이름은 김영조입니다

2003 번 교수님 이름은 주승재입니다



7. Explicit Cursor 와 FOR UPDATE 문장

명시적 커서를 선언해서 데이터를 조회한 후 변경하려던 중 다른 세션에서 현 세션이 작업하는 내용을 변경할 수 있다.

그래서 커서를 선언할 때 커서에 있는 행들에 대해 잠금(LOCK)을 수행할 수 있다.

커서를 정의할 때 SELECT ~ FOR UPDATE 문장을 사용하면 된다.

문법

SELECT    ...

FROM        ...

FOR UPDATE [OF column_reference][NOWAIT|WAIT n] ;


NOWAIT 옵션은 다른 세션에서 행을 잠글 경우 즉시 오라클 에러를 발생시켜주는 옵션이다.

NOWAIT 옵션을 사용하지 않을 경우 LOCK 이 확보될 때까지 무한 대기상태가 된다.


커서를 선언할 때 FOR UPDATE 절을 써서 행을 잠근 후

UPDATE 문장 등에서 해당 커서에 접근할 때에는

WHERE CURRENT OF 커서명 을 사용한다.


FOR UPDATE 구문 사용 예

DECLARE

CURSOR emp_cur IS

SELECT    empno, ename, sal

FROM        emp

WHERE    empno = 20

FOR UPDATE         -- 커서 선언시에 FOR UPDATE 로 행을 잠금

NO WAIT ;


BEGIN


OPEN emp_cur ;


UPDATE emp

SET sal = sal * 2

WHERE CURRENT OF emp_cur     --커서 선언 시에 잠긴 행 갱신함


CLOSE emp_cur

END ;


8. REF Cursor

CURSOR 란 메모리 공간에 있는 SELECT 로 조회된 데이터 집합으로 연결해주는 포인터의 역할을 한다고 했습니다.

사용자의 간섭없이 오라클이 자동으로 생성하는 묵시적 CURSOR 와 

사용자가 원하는 값을 직접 지정하고 제어할 수 있는 명시적 CURSOR 가 있다고 살펴보았습니다.


그런데 묵시적 CURSOR 와 명시적 CURSOR 는 CURSOR 가 선언이 될 때 수행될 SQL 을 미리 지정하고 실행하는 방법만을 지원한다.

예를 들어 사용자가 1번을 선택하면 학생테이블을 조회하고, 2번을 선택하면 교수테이블을 선택하고 

오라클은 CURSOR 를 선언하는 시점에 수행될 SQL 을 지정하지 않고 CURSOR 가 OPEN 되는 시점에 

실제 수행될 SQL 문장을 지정할 수 있도록 보다 편리해진 방법을 제공하는데 이것을 REF CURSOR 라고 부른다.


묵시정, 명시적 커서는 커서가 선언될 때 SQL 이 지정되면 변경할 수 없으므로 정적 (STATIC) 커서 라고 하고

REF CURSOR 는 동적 (DYNAMIC) 커서 라고 부르기도 한다.


1)  선언부에서  Ref Cursor  이름을  선언합니다.  단  Sub Query  는  선언하지  않습니다. 


 2) 1)에서  선언한  Cursor  를  사용할  변수를  선언합니다.  

   이것은  앞에서  살펴본  Record Type  이나  Table Type  을  선언하고  해당  Type  을  사용하는 변수를  추가로  선언해  준  방법과  동일합니다.  

   이  변수는  Cursor  가  Open  될  때  서브쿼리를  수행해서  그  결과를  임시로  담는  역할을  합니다. 

   만약  Strong Ref Cursor  라면  이  부분에서  Return Type  을  적어줍니다. 


 3) 2)번  과정에서  생성한  Cursor  변수에  담긴  데이터를  옮겨  담을  실제  변수를  선언합니다. 

   스칼라  변수도  괜찮고  만약  데이터가  여러  건일  경우는  앞에서  배운  Record Type  이나   Table Type  변수를  사용해도  됩니다.  

   위  2번  과정에서  Cursor  변수에  임시로  담겨  있는  데이터는  이  과정에서  만들어진  변수로  fetch  됩니다. 


Ref Cursor  는  다시  Weak Ref Cursor (약한  타입-비  제한적  타입)와  Strong Ref Cursor (강한  타입-제한적  타입)으로  나눌  수  있습니다. 

Strong  Ref  Cursor  는  Cursor  를  수행  후에  반환되는  데이터타입을  명시적으로  지정해  주어야  합니다.  

반면  Weak Ref Cursor  는  반환되는  데이터타입을  지정하지  않아도  됩니다. 

아래의  예로  두  가지의  Ref Cursor  를  자세하게  살펴보겠습니다. 


1. Weak Ref Cursor (약한  타입-  비  제한적  Ref Cursor ) 

사용자에게   1) Student , 2) Professor , 3) Department  의  메시지를  보인  후에  사용자가  1  을  입력하면  

학생들의  학번(studno),  이름  (name)  을  출력하고  , 2를  입력하면  교수들의 교수번호(profno), 이름  (name)을  출력하고  , 3을  입력하면  학과의  번호(deptno),  학과명(dname)  을  출력하는  예입니다. 


!vi weak_ref1.sql

파일 생성


set echo off

set serveroutput on

set verify off

set define '&'


prompt

prompt '출력을 원하는 번호를 선택하세요'

accept num prompt '1) Student, 2) Professor, 3) Department : '

prompt


declare

type weak_ref_cur1 is ref cursor ;

w_ref weak_ref_cur1 ;


type weak_type_1 is record(

no number,

name varchar2(30)) ;

v_weak_1 weak_type_1 ;


choice char(1) := &num ;


begin

if choice = 1 then

open w_ref for

select studno, name

from    student ;

dbms_output.put_line('Printing Student Information--------') ;

elsif choice = 2 then

open w_ref for

select profno, name

from    professor;

dbms_output.put_line('Printing Professor Information--------') ;

elsif choice = 3 then

open w_ref for

select deptno, dname

from    department ;

dbms_output.put_line('Printing Department Information--------') ;

end if ;


fetch w_ref into v_weak_1 ;


while w_ref%found loop

dbms_output.put_line('no: '||v_weak_1.no||', name: '||v_weak_1.name) ;

fetch w_ref into v_weak_1 ;

end loop ;


close w_ref ;

end ;

/


저장

wq!


실행

@weak_ref1.sql




2. Strong Ref Cursor (강한  타입-  제한적  Ref Cursor) 

앞에서  살펴본  Weak Ref Cursor  은  Cursor  를  선언할  때  리턴  할  데이터  타입을  지정하지  않아도 잘  작동했지만  

Strong  Ref  Cursor  는  Cursor  를  선언할  때  반드시  리턴  할 데이터  타입을  지정해야  합니다.  

그래서  Strong  Ref  Cursor  은  Cursor  로  부터  데이터를  받아서 저장할  데이터  타입을 먼저  선언을  해  놓고  

Cursor  를  선언해야  한다는  부분이  Weak Ref Cursor  와 다른  점  입니다. 

아래의  실습으로  테스트  해  보겠습니다. 

아래의  실습은  emp  테이블에서  empno,  ename,job  을  ref  cursor  를  사용하여  변수에  담아  출력하는  예제입니다.  

이  예제에서는  여러  컬럼와  여러  로우를  쉽게  저장하기  위해서  record  type  변수형을  선언해서 사용했습니다.  

물론  이  예처럼  record  type  변수를  써야  하는  것은  아니며  다른  변수도  얼마든  사용할  수  있습니다. 


set serveroutput on


declare

type emp_job_rec is record 

(

empno number,

ename varchar2(10),

job varchar2(10)

) ;


type emp_job_refcur_type is ref cursor

return emp_job_rec ;


emp_refcur emp_job_refcur_type ;


emp_job emp_job_rec ;


begin

open emp_refcur for

select    empno, ename, job

from        emp ;


fetch emp_refcur into emp_job ;


while emp_refcur%found loop

dbms_output.put_line(emp_job.empno||' '||emp_job.ename||' '||emp_job.job) ;

fetch emp_refcur into emp_job ;

end loop ;

end ;

/



위  예에서  알  수  있듯이  Strong  ref  Cursor  는  Cursor  에서  변수로  값을  돌려줄  때  (Return)  형식

이  지정되어  있어야  하므로  제한적이라고  하는  것입니다.  그러나  Weak ref Cursor  는  형식이  지정

되지  않기  때문에  데이터  형이   다른  다양한  데이터를  선택해서  조회  할  경우  유용하게  사용될

수  있고  현재도  많이  사용되는  Cursor  이므로  꼭  습득하시기  바랍니다.


- SQL CURSOR  연습문제 

1.  부서코드를  입력  받아  해당  부서에  속한  사원들을  삭제한  후  삭제된  사원  건수를  출력하세요. 

(묵시적  커서를  사용하세요) 



2.  부서코드를  입력  받아  그  부서에  속한  사원들의  이름,  급여를  출력하세요. 

(여러  건의  데이터를  작업해야  하므로  명시적  커서와  Basic Loop  문을  사용하세요) 



이상으로  PL/SQL  에서  사용하는  커서에  대해  살펴보았습니다. 

아주  많이  사용하는  기능이므로  잘  연습하시길  바랍니다. 




[출처] 다양한 예제로 쉽게 배우는 오라클 SQL과 PL/SQL 서진수 저



반응형