Cursor 커서
A Cursor is a pointer to this context area.
쿼리문에 의해 반환되는 결과값들을 저장하는 메모리 공간에 대한 포인터
- Fetch
Cursor에서 원하는 결과값을 추출하는 것
- Cursor의 종류
- Explicit Cursor 명시적 커서
사용자가 선언하여 생성 후 사용하는 SQL Cursor
주로 여러개의 행을 처리하고자 할 경우 사용
- implicit Cursor 묵시적 커서
오라클에서 자동으로 선언해주는 SQL Cursor
사용자는 생성 유무를 알 수 없다. 주로 1개의 행을 처리
- Cursor의 속성
- %Found
Fetch가 발생하면 true 반환
-> 할당할 레코드가 있으면 true 반환
- %isOpen
커서가 오픈 상태일 경우 true 반환
- %NotFound
할당할 레코드가 없는 경우 true 반환
- %RowCount
카운터 역할
오픈 되었을 경우 0, Fetch 발생할때마다 1씩 증가
- Cursor의 처리 단계 ( 명시적 커서 )
- Cursor [ Cursor Name ] --> 명시적 커서 선언
- Open [ Cursor Name ] --> 명시적 커서 오픈
- Fetch [ Cursor Name ] --> 커서에서 데이터 추출
- Close [ Cursor Name ] --> 커서 종료
DECLARE
emp_id number(10);
emp_name varchar2(20);
emp_salary number(20);
CURSOR cul IS
select EMPLOYEE_ID, LAST_NAME, SALARY
from EMPLOYEES e2
where DEPARTMENT_ID='50';
BEGIN
OPEN cul;
dbms_output.put_line('사번 이름 급여 ');
LOOP
FETCH cul INTO emp_id, emp_name, emp_salary;
EXIT WHEN cul%NOTFOUND;
dbms_output.put_line(emp_id || ' ' || emp_name || ' ' || emp_salary);
END LOOP;
CLOSE cul;
END;
/
- Output
- Cursor와 반복문
For [Record Name] IN [Cursor Name] LOOP
-- 명시적 커서의 OPEN, FETCH가 자동으로 수행
SQL Sentences;
END LOOP;
-- 루프문을 빠져 나갈 때 커서가 자동으로 종료
DECLARE
CURSOR emp_cur IS
SELECT EMPLOYEE_ID, LAST_NAME FROM EMPLOYEES e2
WHERE SALARY < 5000;
BEGIN
FOR emp_rec IN emp_cur LOOP
dbms_output.put_line(emp_rec.employee_id || ' ' || emp_rec.last_name);
END LOOP;
END;
/
- Output
- TYPE 변수 사용 예제
DECLARE
emp employees%rowtype;
CURSOR cur1 IS
SELECT EMPLOYEE_ID, LAST_NAME, SALARY FROM EMPLOYEES e;
BEGIN
FOR emp IN cur1 LOOP
EXIT WHEN cur1%NOTFOUND;
dbms_output.put_line(emp.employee_id || ' ' || emp.last_name || ' ' || emp.salary);
END LOOP;
END;
/
- Output
- Cursor 선언하지 않고 사용
가장 많이 쓰게 되는 방법
DECLARE
BEGIN
FOR emp IN (SELECT EMPLOYEE_ID, LAST_NAME, SALARY FROM EMPLOYEES e2)
LOOP
dbms_output.put_line(emp.employee_id || ' ' || emp.last_name || ' ' || emp.salary);
END LOOP;
END;
/
- 묵시적 커서 사용
DECLARE
cnt1 NUMBER;
cnt2 NUMBER;
BEGIN
SELECT count(*) INTO cnt1
FROM EMPLOYEES e
WHERE DEPARTMENT_ID = 50;
cnt2 := SQL%rowcount;
-- 묵시적 커서는 Cursor 대신에 속성 사용시 SQL%속성 사용
-- Fetch 할때마다 1씩 증가
dbms_output.put_line('cnt1의 값: ' || cnt1);
dbms_output.put_line('cnt2의 값: ' || cnt2);
END;
/
- Output
cnt1 : count(*) -- 45
cnt2: 쿼리의 count값(메모리 공간의 결과값)이 cnt1에 들어갈 때 Fetch 1번 발생 -- 1
'SQL' 카테고리의 다른 글
[Oracle] PL/SQL 서브 프로그램의 이해, 프로시저 (0) | 2020.07.26 |
---|---|
[Oracle] PL/SQL 예외 처리의 개념, 종류, 사용법 (0) | 2020.07.16 |
[Oracle] PL/SQL 반복문 (Loop, While, For Loop, Continue) (0) | 2020.07.06 |
[Oracle] PL/SQL 조건문 (if문, case문) (0) | 2020.07.06 |
[Oracle] PL/SQL 컬렉션, 바인드 변수 (0) | 2020.06.28 |