오라클 PL/SQL에서 커서(CURSOR)는 데이터베이스 쿼리의 결과를 순차적으로 처리하기 위한 메커니즘이다.
커서는 SQL 쿼리의 결과를 한 행씩 접근할 수 있게 해 주며, 여러 행을 순차적으로 처리할 때 사용된다.
즉, 커서는 데이터를 순차적으로 탐색하고 처리할때 주로 사용된다.
사용자가 직접 정의하여 사용하는 커서이다.
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;
묵시적 커서는 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;
명시적 커서는 사용자가 직접 선언하고 관리하기 때문에 복잡한 쿼리나 대량의 데이터 처리에 적합하다.
묵시적 커서는 PL/SQL이 자동으로 관리(명시적인 제어X)하며, SELECT INTO문 또는 DML언어에 의해 자동으로 생성되기 때문에 간단한 데이터 조회 및 조작에 적합하다.
명시적 커서는 더 많은 제어와 유연성을 제공하지만, 추가적인 코드 작성이 필요합니다. 반면, 묵시적 커서는 간단한 데이터 처리에 유용하며, 내부적으로 자동 처리되므로 코드를 간결하게 유지할 수 있다.
즉, 각의 장단점이 존재한다.