[Oracle PL/SQL] 커서(CURSOR)

코린이·2024년 9월 1일

ORACLE PL/SQL

목록 보기
2/7

커서(CURSOR)

오라클 PL/SQL에서 커서(CURSOR)는 데이터베이스 쿼리의 결과를 순차적으로 처리하기 위한 메커니즘이다.

커서는 SQL 쿼리의 결과를 한 행씩 접근할 수 있게 해 주며, 여러 행을 순차적으로 처리할 때 사용된다.

즉, 커서는 데이터를 순차적으로 탐색하고 처리할때 주로 사용된다.

✅ 명시적 커서(Explicit Cursor)

사용자가 직접 정의하여 사용하는 커서이다.

1. 커서 선언: CURSOR 키워드를 사용해 커서를 선언.
2. 커서 열기: OPEN 명령어로 커서를 열어 쿼리 결과를 가져오기.
3. 행 처리: FETCH 명령어로 커서에서 한 행씩 데이터를 가져오기.
4. 커서 닫기: CLOSE 명령어로 커서를 닫는다.

DECLARE
    CURSOR <커서명> IS   --커서 선언/정의
        SELECT 
            <속성1>
            , <속성2>
            , <속성3>
        FROM <테이블명>
    ;
   
    <변수1>  <테이블>.<속성1>%TYPE;
    <변수2>  <테이블>.<속성2>%TYPE;
    <변수3>  <테이블>.<속성3>%TYPE;
BEGIN
    OPEN <커서명>;      --커서 열기
        LOOP
            FETCH <커서명> INTO (<변수1>, <변수2>, <변수3>);    --커서 행 처리
            EXIT WHEN <커서명>%NOTFOUND;
        END LOOP;     --커서 닫기
    CLOSE <커서명>;
END;

▶︎ 명시적 커서 변수 선언

명시적 커서는 사용자가 임이의 명시적 타입으로 정의 후 변수로 선언하여 사용할 수 있다.

임이의 명시적 타입은 강한 타입(Strong type)약한 타입(Weak type)으로 정의할 수 있다.

강한 타입(Strong type)

강한 타입으로 정의할 경우 IS REF CURSOR문 이후 RETRUN문을 작성하여 커서의 레코드 필드 타입을 사전에 정의해야 한다.

--STRONG TYPE
TYPE <커서 타입명_1> IS REF CURSOR RETURN <테이블명>%ROWTYPE;  -- 커서 타입 정의
<커서명_1> <커서 타입명_1>;  --커서 변수 선언

약한 타입(Weak type)

약한 타입은 레코드의 필드가 명확하게 정의된 데이터 타입을 가지지 않으며, 커서 변수를 사용할 때 자동으로 타입이 정의된다.

--WEEK TYPE
TYPE <커서 타입명_2> IS REF CURSOR;
<커서명_2> <커서 타입명_2>;

사용자가 별도의 커서 타입을 정의하지 않고, 오라클에서 제공하는 SYS_REFCURSOR 유형으로 정의하여 커서 변수를 선언할 수 있다.

--WEEK TYPE
<커서명> SYS_REFCURSOR;

✅ 묵시적 커서(Implicit Cursor)

묵시적 커서는 PL/SQL 블록에서 SELECT INTO문 또는 DML언어에 의해 자동으로 생성되는 커서이다.

DECLARE
	v_name table_tb.name%TYPE;
BEGIN
    SELECT name
    INTO v_name
    FROM table_tb
    WHERE name like '김%';
END;

묵시적 커서는 명시적인 제어를 할 수 없지만, %FOUND, %NOTFOUND, %ROWCOUNT, %ISOPEN 등의 속성을 통해 커서 상태를 확인 할 수 있다.

📝 묵시적 커서 주요 속성

%FOUND : 커서가 데이터를 찾았는지 여부를 나타냅니다.
%NOTFOUND : 커서가 데이터를 찾지 못했는지 여부를 나타냅니다.
%ROWCOUNT : 커서가 처리한 행 수를 반환합니다.
%ISOPEN : 커서가 열려 있는지 여부를 나타냅니다.

-- %FOUND
IF SQL%FOUND THEN  --특정 커서를 찾으면 해당 제어문 실행
    DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);  --특정 커서가 처리한 데이터 수를 반환
END IF;
-- %ROWCOUNT
IF SQL%ROWCOUNT > 0 THEN  --특정 커서가 처리한 행의 수가 1 이상이면 해당 제어문 실행
    DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);  --특정 커서가 처리한 데이터 수를 반환
END IF;
-- %NOTFOUND
IF SQL%FOUND THEN
    DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);
ELSIF SQL%NOTFOUND THEN   --특정 커서가 데이터를 찾지 못 하면 실행
    DBMS_OUTPUT.PUT_LINE('XXX');
END IF;

✅ 명시적 커서 vs 묵시적 커서

명시적 커서는 사용자가 직접 선언하고 관리하기 때문에 복잡한 쿼리나 대량의 데이터 처리에 적합하다.

묵시적 커서는 PL/SQL이 자동으로 관리(명시적인 제어X)하며, SELECT INTO문 또는 DML언어에 의해 자동으로 생성되기 때문에 간단한 데이터 조회 및 조작에 적합하다.

명시적 커서는 더 많은 제어와 유연성을 제공하지만, 추가적인 코드 작성이 필요합니다. 반면, 묵시적 커서는 간단한 데이터 처리에 유용하며, 내부적으로 자동 처리되므로 코드를 간결하게 유지할 수 있다.

즉, 각의 장단점이 존재한다.

0개의 댓글