오라클에서는 SQL 문을 실행할 때 자동으로 생성되는 묵시적 커서(Implicit Cursor) 를 제공합니다. 이를 통해 SQL 문이 데이터에 미친 영향을 쉽게 확인할 수 있다는 것, 아시나요? 묵시적 커서는 SELECT INTO, INSERT, UPDATE, DELETE 문 실행 후 자동으로 열리고 닫힌답니다. 우선, 묵시적 커서 속성에 대해 알아보겠습니다.
묵시적 커서 속성
| 속성 | 설명 | 사용 가능 SQL |
|---|---|---|
SQL%FOUND | DML 실행 후 한 건 이상 처리되었을 때 TRUE | INSERT, UPDATE, DELETE, SELECT INTO |
SQL%NOTFOUND | DML 실행 후 처리된 행이 없을 때 TRUE | INSERT, UPDATE, DELETE, SELECT INTO |
SQL%ROWCOUNT | DML 실행 후 영향을 받은 행의 개수 | 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;
/
✔️ 실행 결과
- 커서가 열려 있다면
"커서가 열려 있습니다."출력 - 이후 커서를 닫음
✅ 정리
- DML 실행 후 데이터가 변경되었는지 확인하려면?
→SQL%FOUND/SQL%NOTFOUND사용 - DML 실행 후 영향을 받은 행의 개수를 확인하려면?
→SQL%ROWCOUNT사용 - 커서가 열려 있는지 확인하려면?
→SQL%ISOPEN사용 (명시적 커서 전용)
묵시적 커서 속성을 활용하여 DML 실행 결과를 쉽게 제어해 보세요~ 😊
