Oracle PL/SQL에서 커서 속성은 커서의 현재 상태와 처리 상황을 확인하는 데 도움을 주는 역할을 합니다. 특히 커서를 사용한 데이터 조회나 반복 처리를 할 때, 속성을 활용하면 오류나 예외 상황을 쉽게 관리할 수 있어 코드의 안정성을 높일 수 있어요.
주요 커서 속성과 그 역할에 대해 자세히 알아보도록 해요.
%ISOPEN
- 설명: 커서가 현재 열려 있는지를 나타냅니다.
- 용도: 커서를 열거나 닫기 전 상태를 확인하여 오류를 방지하는 데 사용됩니다.
- 값:
TRUE
: 커서가 열려 있는 경우.FALSE
: 커서가 닫혀 있는 경우.
- 예시:
IF my_cursor%ISOPEN THEN CLOSE my_cursor; -- 이미 열려 있을 경우 닫기 END IF; OPEN my_cursor;
%FOUND
- 설명: 커서에서 데이터를 성공적으로 조회했는지 여부를 나타내는 속성입니다.
- 용도: 커서를 열고 데이터를 가져온 후 조건에 따라 로직을 분기할 때 유용합니다.
- 값:
TRUE
:FETCH
로 데이터가 성공적으로 조회된 경우.FALSE
: 조회할 데이터가 없거나FETCH
가 실패한 경우.
- 예시:
FETCH my_cursor INTO my_variable; IF my_cursor%FOUND THEN -- 데이터가 있을 때 실행할 코드 ELSE -- 데이터가 없을 때 실행할 코드 END IF;
%NOTFOUND
- 설명: 커서에서 데이터를 찾지 못했을 때
TRUE
를 반환합니다.%FOUND
의 반대 역할을 합니다. - 용도: 조회 결과가 없는 경우를 확인하거나 반복 처리를 중지할 때 사용합니다.
- 값:
TRUE
: 데이터 조회 실패 시.FALSE
: 데이터 조회 성공 시.
- 예시:
LOOP FETCH my_cursor INTO my_variable; EXIT WHEN my_cursor%NOTFOUND; -- 데이터가 있을 때 실행할 코드 END LOOP;
%ROWCOUNT
- 설명: 커서에서
FETCH
를 통해 조회한 행의 수를 반환합니다. - 용도: 조회된 행 수를 확인하거나 반복문에서 처리한 레코드 수를 추적할 때 유용합니다.
- 값:
0
또는 양의 정수:FETCH
된 행의 수.0
: 아직FETCH
를 하지 않았거나 결과가 없는 경우.
- 예시:
OPEN my_cursor; LOOP FETCH my_cursor INTO my_variable; EXIT WHEN my_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE('Rows fetched: ' || my_cursor%ROWCOUNT); END LOOP; CLOSE my_cursor;
커서 속성 사용
열려 있는 커서:
%ISOPEN
을 사용해 커서가 열려 있는지 확인하는 것이 중요합니다. 열려 있는 커서를 중복으로 열면 오류가 발생할 수 있습니다.행 조회 시 속성 조합:
%FOUND
와%ROWCOUNT
를 조합해 데이터 조회가 완료되었는지, 몇 개의 데이터가 조회되었는지 확인할 수 있습니다.루프 구조 내 사용:
%NOTFOUND
는LOOP
와 함께 사용할 때 데이터가 모두 조회되었는지 확인해, 불필요한 로직 수행을 방지합니다.상태 확인의 효율성: 커서의 속성을 적절히 활용해 로직의 분기를 간단히 처리할 수 있습니다.
커서 속성 사용 방법 예제
커서 속성을 사용한 데이터 조회 루프 예시는 다음과 같습니다.
DECLARE
CURSOR emp_cursor IS
SELECT empno, ename FROM emp; -- EMP 테이블에서 empno(직원 ID)와 ename(직원 이름) 조회
emp_id emp.empno%TYPE; -- 직원 ID를 저장할 변수
emp_name emp.ename%TYPE; -- 직원 이름을 저장할 변수
BEGIN
OPEN emp_cursor; -- 커서 열기
LOOP
FETCH emp_cursor INTO emp_id, emp_name; -- 커서에서 데이터 가져오기
EXIT WHEN emp_cursor%NOTFOUND; -- 더 이상 데이터가 없을 경우 루프 종료
-- 조회된 데이터에 따라 로직 처리
DBMS_OUTPUT.PUT_LINE('Employee ID: ' || emp_id || ', Name: ' || emp_name);
DBMS_OUTPUT.PUT_LINE('Rows fetched so far: ' || emp_cursor%ROWCOUNT); -- 지금까지 조회된 행 수 출력
END LOOP;
IF emp_cursor%ISOPEN THEN
CLOSE emp_cursor; -- 커서가 열려 있을 경우 닫기
END IF;
END;
CURSOR 선언:
emp_cursor
라는 이름의 커서를 선언하고, EMP 테이블에서 직원 ID(empno)와 이름(ename)을 조회하는 SQL 문을 정의합니다.변수 선언:
emp_id
와emp_name
변수를 선언하여 각각 직원 ID와 이름을 저장할 수 있도록 합니다.커서 열기:
OPEN emp_cursor;
를 통해 커서를 엽니다. 이를 통해 데이터에 접근할 수 있습니다.데이터 조회 루프:
FETCH emp_cursor INTO emp_id, emp_name;
문장을 사용해 커서에서 데이터를 가져옵니다.EXIT WHEN emp_cursor%NOTFOUND;
를 통해 더 이상 조회할 데이터가 없을 경우 루프를 종료합니다.- 조회된 데이터에 대해
DBMS_OUTPUT.PUT_LINE
을 사용하여 직원 ID와 이름을 출력합니다. 또한,%ROWCOUNT
속성을 사용하여 지금까지 조회된 행 수를 출력합니다.
커서 닫기: 루프가 종료된 후,
IF emp_cursor%ISOPEN THEN
을 사용하여 커서가 열려 있을 경우 이를 닫습니다.
커서 속성(%FOUND
, %NOTFOUND
, %ISOPEN
, %ROWCOUNT
)을 통해 데이터 조회의 성공 여부, 커서 상태, 조회된 행 수를 정확하게 파악할 수 있어요. 이를 통해 커서 기반의 복잡한 로직을 단순화 할 수 있답니다.
커서 속성 요약
커서가 열리기 전, 열린 다음 n번째 데이터가 페치된 다음, 그리고 닫은 이후 각 속성의 값입니다.
Cursor attribute | %ISOPEN | %FOUND | %NOTFOUND | %ROWCOUNT |
---|---|---|---|---|
Before OPEN | False | Undefined | Undefined | “Cursor not open”exception |
After OPEN and before 1st FETCH | True | Undefined | Undefined | 0 |
After 1st successful FETCH | True | True | False | 1 |
After nth successful FETCH (last row) | True | True | False | n |
After n+1st FETCH (after last row) | True | False | True | n |
After CLOSE | False | Undefined | Undefined | “Cursor not open”exception |