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의 처리 단계 ( 명시적 커서 )

 

  1. Cursor [ Cursor Name ]      -->  명시적 커서 선언 
  2. Open [ Cursor Name ]        -->  명시적 커서 오픈 
  3. Fetch [ Cursor Name ]       -->  커서에서 데이터 추출  
  4. 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

 

 

 

복사했습니다!