PL/SQL 커서 속성 (cursor attributes)

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;
    

커서 속성 사용

  1. 열려 있는 커서: %ISOPEN을 사용해 커서가 열려 있는지 확인하는 것이 중요합니다. 열려 있는 커서를 중복으로 열면 오류가 발생할 수 있습니다.

  2. 행 조회 시 속성 조합: %FOUND%ROWCOUNT를 조합해 데이터 조회가 완료되었는지, 몇 개의 데이터가 조회되었는지 확인할 수 있습니다.

  3. 루프 구조 내 사용: %NOTFOUNDLOOP와 함께 사용할 때 데이터가 모두 조회되었는지 확인해, 불필요한 로직 수행을 방지합니다.

  4. 상태 확인의 효율성: 커서의 속성을 적절히 활용해 로직의 분기를 간단히 처리할 수 있습니다.

커서 속성 사용 방법 예제

커서 속성을 사용한 데이터 조회 루프 예시는 다음과 같습니다.

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;
  1. CURSOR 선언: emp_cursor라는 이름의 커서를 선언하고, EMP 테이블에서 직원 ID(empno)와 이름(ename)을 조회하는 SQL 문을 정의합니다.

  2. 변수 선언: emp_idemp_name 변수를 선언하여 각각 직원 ID와 이름을 저장할 수 있도록 합니다.

  3. 커서 열기: OPEN emp_cursor;를 통해 커서를 엽니다. 이를 통해 데이터에 접근할 수 있습니다.

  4. 데이터 조회 루프:

    • FETCH emp_cursor INTO emp_id, emp_name; 문장을 사용해 커서에서 데이터를 가져옵니다.
    • EXIT WHEN emp_cursor%NOTFOUND;를 통해 더 이상 조회할 데이터가 없을 경우 루프를 종료합니다.
    • 조회된 데이터에 대해 DBMS_OUTPUT.PUT_LINE을 사용하여 직원 ID와 이름을 출력합니다. 또한, %ROWCOUNT 속성을 사용하여 지금까지 조회된 행 수를 출력합니다.
  5. 커서 닫기: 루프가 종료된 후, IF emp_cursor%ISOPEN THEN을 사용하여 커서가 열려 있을 경우 이를 닫습니다.

커서 속성(%FOUND, %NOTFOUND, %ISOPEN, %ROWCOUNT)을 통해 데이터 조회의 성공 여부, 커서 상태, 조회된 행 수를 정확하게 파악할 수 있어요. 이를 통해 커서 기반의 복잡한 로직을 단순화 할 수 있답니다.

커서 속성 요약

커서가 열리기 전, 열린 다음 n번째 데이터가 페치된 다음, 그리고 닫은 이후 각 속성의 값입니다.

Cursor attribute
%ISOPEN
%FOUND
%NOTFOUND
%ROWCOUNT
Before OPENFalseUndefinedUndefined“Cursor not open” exception
After OPEN and before 1st FETCHTrueUndefinedUndefined0
After 1st successful FETCHTrueTrueFalse1
After nth successful FETCH (last row)TrueTrueFalsen
After n+1st FETCH (after last row)TrueFalseTruen
After CLOSEFalseUndefinedUndefined“Cursor not open” exception
이전최근
댓글 쓰기
가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗