개발노트

[PL/SQL] Cursor 본문

Database/Oracle

[PL/SQL] Cursor

개발자? 2022. 8. 11. 20:41

커서(Cursor)

Cursor 는 Oracle 서버에서 할당한 전용 메모리 영역에 대한 포인터이다.

질의의 결과로 얻어진 여러 행이 저장된 메모리상의 위치(포인터) 값이다.

커서는 Select 문의 결과 집합을 처리할 때 사용한다.

 

암시적 커서(Implicit Cursor)

오라클 DB에서 실행되는 모든 SQL문장은 암시적인 커서가 생성되며, 커서 속성을 사용할 수 있다.

모든 DML과 PL/SQL SELECT 문에 대해 선언된다.

암시적인 커서는 오라클이나 PL/SQL 실행 매커니즘에 의해 처리되는 SQL 문장이 처리되는 곳에 대한 익명의 주소이다.

Oracle 서버에서 SQL 문을 처리하기 위해 내부적으로 생성/관리한다.

암시적 커서는 SQL문이 실행되는 순간 자동으로 Open 과 Close 를 실행한다.

SQL 커서 속서을 사용하면 SQL문의 결과를 테스트할 수 있다.

 

암시적 커서의 속성

1) SQL%ROWCOUNT : SQL 문에 의해 반환된 결과 행 수(Number)

2) SQL%FOUND : SQL 문에 의해 반환된 총 행수가 1개 이상일 경우 True, 0개이면 False(Boolean)

3) SQL%NOTFOUND : SQL 문에 의해 반환된 행수가 없을 경우 TRUE

4) SQL%ISOPEN : 암시적 커서가 열려 있는지의 여부 검색, 항상 FALSE(PL/SQL 은 실행 후 바로 암시적 커서를 CLOSE 하기 때문에)

 

명시적 커서

프로그래머에 의해 선언되며 이름이 부여된 커서이다.

 

명시적 커서의 속성

1) %ROWCOUNT : 현재까지 반환된 모든 행의 수 

2) %FOUND : FETCH 한 데이터가 행을 반환하면 TRUE

3) %NOTFOUND : FTCH한 데이터가 행을 반환하지 않으면 TRUE

4) %ISOPEN : 커서가 OPEN 되어 있으면 TRUE

 

커서 사용법

DECLARE 절에서 CURSOR를 선언한다.

FOR LOOP 을 사용하게 되면 행이 없을때까지 FETCH 를 진행하고, 따로 OPEN/FETCH/CLOSE 를 하지 않아도 된다. CLOSE 안쓰는 실수를 방지한다. 또한, ROWTYPE에 해당하는 변수를 따로 선언하지 않아도 된다. 이는 암시적으로 선언된다.

CURSOR FOR LOOP 은 사용법이 간단하고 메모리 관리도 편하기 때문에 제일 많이 사용하고 있다. 

SET SERVEROUTPUT ON;

DECLARE 
	CURSOR C_EMP IS
    SELECT *
      FROM EMP
     WHERE DEPTNO = 10;
    
BEGIN
	FOR V_EMP IN C_EMP LOOP
    	DBMS_OUTPUT.PUT_LINE(V_EMP.EMPNO||'-'||V_EMP.NAME);
    END LOOP;
END;

 

SET SERVEROUTPUT ON;

DECLARE
	-- 커서 정의
    CURSOR C_EMP IS 
    SELECT *
      FROM EMP
     WHERE DEPTNO = 10;
    
    -- 커서의 행을 저장할 변수 정의
    V_EMP EMP%ROWTYPE;
    
BEGIN
	OPEN C_EMP;
    LOOP -- 반복문
    	FETCH C_EMP INTO V_EMP; 
    	EXIT WHEN C_EMP%NOTFOUND;
    	DBMS_OUTPUT.PUT_LINE(V_EMP.EMPNO||'-'||V_EMP.NAME);
    END LOOP;
	CLOSE C_EMP;
END;

OPEN : 결과 행 집합을 식별

FETCH : 현재 행을 변수에 로드

CLOSE : 결과 행 집합 해제

반응형

'Database > Oracle' 카테고리의 다른 글

오라클 인덱스(Index) 구조 - B*Tree  (0) 2023.11.16
계정 생성  (0) 2023.04.04
Oracle RAC  (0) 2022.07.19
Instance 구성  (0) 2022.07.19
Oracle 서버 기동 상태  (0) 2022.07.19
Comments