커서(Cursor)
특정 SQL 문장을 처리한 결과를 담고 있는 메모리 영역을 가리키는 일종의 포인터이다.
묵시적 커서
SQL을 수행할 때 자동으로 생성되는 커서이다. 묵시적 커서를 사용하면 수행한 SQL에 대해서 여러가지 정보를 얻을 수 있다.
* 묵시적 커서 사용하기
CREATE OR REPLACE PROCEDURE pr_increase_emp_sal
(p_enum IN NUMBER)
IS
BEGIN
UPDATE EMPLOYEES SET SALARY = SALARY + 100
WHERE EMPLOYEE_ID = p_enum;
-- 영향 받은 행이 1개 이상 있을 경우
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE('해당 사원의 급여를 100만큼 증가시켰습니다.');
-- 영향 받은 행이 없을 경우
ELSIF SQL%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE('사원이 존재하지 않습니다.');
END IF;
END;
명시적 커서
사용자가 직접 선언하여 생성한 커서이다.
* 명시적 커서 사용하기
DECLARE
-- 커서 선언
CURSOR cur_emp IS
SELECT FIRST_NAME || ' ' || LAST_NAME AS NAME, SALARY
FROM EMPLOYEES;
v_emp_nm VARCHAR2(100);
v_emp_sal NUMBER := 0;
BEGIN
-- 커서 오픈
OPEN cur_emp;
LOOP
-- 커서 패치 (fetch; 인출)
FETCH cur_emp INTO v_emp_nm, v_emp_sal;
-- 커서에 더 이상 값이 없을 때 반복문 종료
EXIT WHEN cur_emp%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('사원 명 : ' || v_emp_nm || ', 급여 : ' || v_emp_sal);
END LOOP;
-- 커서 닫기
CLOSE cur_emp;
END;
* FOR 문을 이용한 커서 사용
DECLARE
CURSOR cur_emp IS
SELECT FIRST_NAME || ' ' || LAST_NAME AS NAME, SALARY
FROM EMPLOYEES;
BEGIN
FOR emp IN cur_emp LOOP
DBMS_OUTPUT.PUT_LINE('사원 명 : ' || emp.NAME || ', 급여 : ' || emp.SALARY);
END LOOP;
END;
* 커서의 속성
| SQL%FOUND | 수행 결과의 행의 수가 1개 이상이면 TRUE, 아니면 FALSE |
| SQL%NOTFOUND | 수행 결과의 행의 수가 0개이면 TRUE, 아니면 FALSE |
| SQL%ROWCOUNT | 수행 결과의 행의 수를 반환 |
| SQL%ISOPEN | 커서가 열렸을 경우 TRUE 반환, 닫혔으면 FALSE (묵시적 커서는 SQL 수행 후 바로 닫히기 때문에 항상 FALSE) |
'데이터베이스 > Oracle' 카테고리의 다른 글
| [OracleDB] 계층형 쿼리 (0) | 2023.06.14 |
|---|---|
| [PL/SQL] 반복문 (Loop) (0) | 2023.06.14 |
| [OracleDB] TIMESTAMP로 데이터 복구하기 (0) | 2023.06.13 |
| [OracleDB] 윈도우(Window) 함수 (0) | 2023.06.12 |
| [PL/SQL] 패키지 (PACKAGE) (0) | 2023.02.15 |