본문 바로가기

DB관련/oracle

PL/SQL -4 CURSOR

A> CURSOR

SQL에서 커서란 

SQL문을 실행, 처리를 위한 메모리공간에서

특정한 레코드에 위치한 포인터와 비슷한 개념

커서의 위치를 변경해서 특정 실행 결과를 가지고 온다.

커서의 서브쿼리는 select문만 올 수가 있다.

 

B> 종류

묵시적/ 명시적

 

1.묵시적 커서

오라클 서버가 만듦

SQL% 이 있으면 묵시적 커서

하나만 선언 가능

 

1-1.문형

     SQL%속성

 

1-2. 종류

 

1)SQL%ROWCOUNT 

     해당 커서에서 실행한 총 행의 개수

 

2)SQL%FOUND

커서 안에 데이터가 있느냐 없느냐 TURE, FALSE 리턴

 

3)SQL%ISOPEN

메모리에 OPEN되어 있으면 true 아니면 false

 

4)예시

 

DECLARE
 v_deptno number := &dno;
BEGIN
    delete emp where deptno = v_deptno;
    DBMS_OUTPUT.PUT_LINE('삭제된 데이터 건수는 '|| SQL%ROWCOUNT);
END;

 

 

2.명시적 커서

개발자가 만듦

주로 여러개의 행을 처리할 경우 사용

묵시적 커서와는 다르게 동시에 여러개 선언가능

서브쿼리를 쓰고 그 결과를 가져온다는 점이 VIEW와 비슷함

 

2-1.문형

커서명%속성

 

2-2.종류

1)커서명%ROWCOUNT

   검색한 데이터 총 행 수 

 

2)커서명%FOUND

커서 안에 데이터가 있느냐 없느냐 TURE, FALSE 리턴

 

3)커서명%ISOPEN

메모리에 OPEN되어 있으면 true 아니면 false

 

 

3.명시적 커서 사용

 

1)선언

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

주의 --커서명은 유일하게

 

2)커서 열기 

OPEN 커서 이름;

 

3)데이터를 읽어서 변수에 저장하기 =FETCH 작업

FETCH 커서이름 INTO 변수들

 

4)닫기

CLOSE 커서

 

 

5예시

DECLARE
    vempno number(4);
    vename varchar2(20);
    vsal number(7);
    --커서 선언
    cursor c1 IS 
    SELECT empno,ename,sal 
    FROM emp 
    WHERE deptno=20;

BEGIN

--커서 오픈
    open c1;
--루프를 돌면서 변수에 저장
    LOOP 

--커서로 읽은 정보 변수에 저장
        fetch c1 into vempno,vename, vsal;

--커서로 읽은게 없으면 끝
        exit WHEN c1%NOTFOUND;
    END loop;
    dbms_OUTPUT.PUT_LINE(vempno||' '|| vename||' '|| vsal);

--커서 닫기
    close c1;
END;

 

예시1.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DECLARE 
        CURSOR cur_emp IS
        SELECT ename,sal FROM emp
        WHERE deptno = &dno;
        
        v_ename emp.ename%TYPE;
        v_sal emp.sal%TYPE;
BEGIN 
    OPEN cur_emp;
    LOOP
        FETCH  cur_emp INTO v_ename, v_sal;
        EXIT WHEN cur_emp%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(v_ename||' '|| v_sal);
    END LOOP;
    CLOSE cur_emp;
END;
cs

 

B>CURSOR FOR LOOP

커서용 FOR 문: 명시적 커서의 행수 만큼 수행 됨

문형

FOR 레코드 이름 IN 커서이름 LOOP  --커서의 데이터를 저장할 변수'레코드 이름이'이 선언된다.

실행문

END LOOP;  --END LOOP 시 커서 자동 close

 

예시1.

DECLARE

CURSOR emp_cur IS

SELECT empno,ename

FROM emp;

BEGIN

FOR emp_rec IN emp_cur LOOP

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

END LOOP;

END;

 

예시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;

 

 

C>Explicit Cursor

마치 매개변수를 받는 것처럼 커서를 구성

예시

DECLARE

CURSOR emp_cur (p_dno emp.deptno%type) IS

SELECT EMPNO, ENAME, SAL

FROM EMP

WHERE DEPTNO = p_dno;

BEGIN

OPEN emp_cur(20) ;

CLOSE emp_cur ;

OPEN emp_cur(30) ; 

CLOSE emp_cur ;

END;

'DB관련 > oracle' 카테고리의 다른 글

서브 프로그램 - 프로시져(PROCEDURE)  (0) 2021.01.21
예외와 예외처리  (0) 2021.01.21
PL/SQL 3- 복합 변수, 제어문  (0) 2021.01.20
PL/SQL -2 스칼라 변수  (0) 2021.01.20
PL/SQL -1  (0) 2021.01.20