본문 바로가기

Programming/DataBase

(SQL) 커서(Cursor)에 대해 알아보자

728x90
반응형



▣ 커서(Cursor)란??

  ▷ 쿼리문에 의해서 반환되는 결과값들을 저장하는 메모리공간

     * Fetch : 커서에서 원하는 결과값을 추출하는 것



▣ 커서의 종류

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

  

  ▷ 묵시적(Implicit) 커서 : 오라클에서 자동으로 선언해주는 SQL 커서. 사용자는 생성 유무를 알 수 없다.


▣ 커서의 속성

  ※ 커서를 open하고 나서 fetch가 발생하면 true 값을 반환


  ▷ %FOUND - 할당할 레코드가 있는 경우 true값을 반환.


  ▷ %isOpen - 커서가 오픈상태일 경우 true값을 반환.


  ▷ %NotFound - 할당할 레코드가 없는 경우 true값을 반환.


  ▷ %RowCount - 카운터 역할을 한다. 커서가 오픈됐을 경우 0, 패치가 발생할 때 마다 1씩 증가.


▣ 커서의 처리단계(명시적 커서)

   1. 명시적 커서 선언       → Cursor 커서이름

   2. 명시적 커서 오픈       → Open 커서이름

   3. 커서에서 데이터 추출  → Fetch 커서이름

   4. 커서 종료                 → Close 커서이름


사용 예시)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Declare
    emp_id number(4);
    emp_name varchar2(10);
    emp_salary number(10);
    
Cursor cu1 is 
 select empno, ename, sal
 from emptest1
 where deptno = 30
 
 begin
     open cu1;
     dbms_output.put_line('사번        이름         급여');
     
     loop
        fetch cu1 into emp_id, emp_name, emp_salary;      --fetch 커서에서 값을 꺼내오는 것
        exit when cu1%NotFound; --커서에 있는 데이터를 fatch하여 넣어주는데
                                                   --더이상 변수에 할당할 레코드가 없을 때 빠져나간다
        dbms_output.put_line(emp_id||' '||emp_name||' '||emp_salary);
        end loop;
        close cu1;
        end;
        /
cs

1) Declare(선언부)에서 변수 선언 및 커서 선언

   Cursor cu1 is  --커서 cu1 선언

   select empno, ename, sal

   from emptest1

   where deptno = 30; -- emptest1 테이블에서 deptno가 30인 데이터중

                                  empno, ename, sal 을뽑아 cu1에 넣어줌

2) begin

    open cu1; --커서를 오픈

    

    loop --loop 시작

       fetch cu1 into emp_id, emp_name, emp_salary;  --fetch작업. 커서에서 값을 꺼내옴

       exit when cu1%NotFound; --커서에 있는 데이터를 fetch하여 넣어주는데

                                          --더이상 변수에 할당할 레코드가 없으면 빠져나간다.

    end loop;  --loop 종료

    close cu1; --커서 닫기

3) end;

4) /


▣ 커서와 반복문(For문)

   ▷ 사용 형식

       FOR 레코드 네임 IN 커서이름 LOOP

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

       실행 문장들

       END LOOP; 루프문을 빠져나갈 때 자동적으로 커서가 종료된다.


사용예시)

1
2
3
4
5
6
7
8
9
10
11
12
DECLARE  -- 레코드 사용
     cursor emp_cur is
     select empno, ename
     from emptest1;
begin
    for emp_rec  in emp_cur loop
       dbms_output.put_line(emp_rec.empno||' '||emp_rec.ename);
    end loop;
 
 
end;
/
cs

1) DECLARE(선언문) 에서 커서를 선언해준다

2) BEGIN FOR문을 이용해 반복시킨다

3) END;

4) / 



▣ 묵시적 커서 사용

   ▷ 속성 사용 시 SQL%NotFound, SQL%rowcount, SQL%Found, SQL%inOpen과 같이 SQL을 넣어 사용


사용예시)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
declare
   cnt1 number;
   cnt2 number;
   
begin
   select count(*into cnt1 --count값은 커서에 있는 것인데 그 값을 추출할 때 fetch발생
   from emp
   where deptno = 30;
   
   cnt2 := sql%rowcount; --묵시적 커서
   
   dbms_output.put_line('cnt1의 값 : ' || cnt1);
   dbms_output.put_line('cnt2의 값 : ' || cnt2);
   end;
   /
cs

1) DECLARE 에서 커서 선언

2) BEGIN 에서 cnt2 묵시적 커서로, 속성사용하기위해 SQL사용

3) END;

4) /

5) 출력결과로 deptno 가 30인 인원이 6명이기에 cnt1의 값은 6이 나오고

   count를 추출할 때 fetch가 한번 발생했기 때문에 cnt2의 값은 1이 나옴.

반응형