[Oracle] SQL%FOUND, SQL%NOTFOUND 같은 기능은 select 뿐만 아니라 update와 같은 구문에도 사용 가능. 오라클 SQL 묵시적 커서 속성 정리

오라클에서는 SQL 문을 실행할 때 자동으로 생성되는 묵시적 커서(Implicit Cursor) 를 제공합니다. 이를 통해 SQL 문이 데이터에 미친 영향을 쉽게 확인할 수 있다는 것, 아시나요? 묵시적 커서는 SELECT INTO, INSERT, UPDATE, DELETE 문 실행 후 자동으로 열리고 닫힌답니다. 우선, 묵시적 커서 속성에 대해 알아보겠습니다.

묵시적 커서 속성

속성설명사용 가능 SQL
SQL%FOUNDDML 실행 후 한 건 이상 처리되었을 때 TRUEINSERT, UPDATE, DELETE, SELECT INTO
SQL%NOTFOUNDDML 실행 후 처리된 행이 없을 때 TRUEINSERT, UPDATE, DELETE, SELECT INTO
SQL%ROWCOUNTDML 실행 후 영향을 받은 행의 개수INSERT, UPDATE, DELETE, SELECT INTO
SQL%ISOPEN묵시적 커서는 자동으로 닫히므로 항상 FALSE사용 불가 (명시적 커서 전용)

1️⃣ SQL%FOUND, SQL%NOTFOUND 사용 예제

UPDATE 문을 실행한 후, 영향을 받은 데이터가 있는지 확인하는 예제이니 참고하세요~ FOUND와 NOT FOUND는 찾는다의 개념으로 인식하여 SELECT와 연관이 있어보이는데요, UPDATE와 DELETE 같은 DML에도 유효해요!

BEGIN
    UPDATE EMP
    SET SAL = SAL * 1.1
    WHERE DEPTNO = 10;

    IF SQL%FOUND THEN
        DBMS_OUTPUT.PUT_LINE('급여가 인상되었습니다.');
    ELSIF SQL%NOTFOUND THEN
        DBMS_OUTPUT.PUT_LINE('해당 부서의 직원이 없습니다.');
    END IF;
END;
/

✔️ 실행 결과

  • DEPTNO = 10 부서에 직원이 존재하면 급여가 10% 인상되고, "급여가 인상되었습니다." 출력
  • 해당 부서에 직원이 없다면 "해당 부서의 직원이 없습니다." 출력

2️⃣ SQL%ROWCOUNT 사용 예제

DELETE 문 실행 후 영향을 받은 행의 개수를 출력하는 예제입니다.

BEGIN
    DELETE FROM EMP WHERE DEPTNO = 20;

    DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT || '명의 직원이 삭제되었습니다.');
END;
/

✔️ 실행 결과

  • DEPTNO = 20 부서의 직원들이 삭제됨
  • 삭제된 직원 수를 출력

3️⃣ SQL%ISOPEN 사용 예제 (명시적 커서 전용)

묵시적 커서는 실행 후 자동으로 닫히므로, SQL%ISOPEN 속성은 항상 FALSE를 반환합니다.
따라서 명시적 커서(Explicit Cursor) 에서만 사용해야 합니다.

DECLARE
    CURSOR emp_cursor IS SELECT * FROM EMP WHERE DEPTNO = 30;
BEGIN
    OPEN emp_cursor;

    IF emp_cursor%ISOPEN THEN
        DBMS_OUTPUT.PUT_LINE('커서가 열려 있습니다.');
    END IF;

    CLOSE emp_cursor;
END;
/

✔️ 실행 결과

  • 커서가 열려 있다면 "커서가 열려 있습니다." 출력
  • 이후 커서를 닫음

✅ 정리

  1. DML 실행 후 데이터가 변경되었는지 확인하려면?
    SQL%FOUND / SQL%NOTFOUND 사용
  2. DML 실행 후 영향을 받은 행의 개수를 확인하려면?
    SQL%ROWCOUNT 사용
  3. 커서가 열려 있는지 확인하려면?
    SQL%ISOPEN 사용 (명시적 커서 전용)

묵시적 커서 속성을 활용하여 DML 실행 결과를 쉽게 제어해 보세요~ 😊

이전최근
댓글 쓰기
가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗