Cursor

양혜정·2024년 3월 26일

Oracle

목록 보기
48/49

명시적 CURSOR 만들기

[문법]

  • 1단계 - CURSOR 의 선언(정의)
CURSOR 커서명
IS
SELECT;
  • 2단계 - CURSOR 의 OPEN
OPEN 커서명;
  • 3단계 - CURSOR 의 FETCH
    -> FETCH 란 ? SELECT 되어진 결과물을 끄집어 내는 작업
FETCH 커서명 INTO 변수;
  • 4단계 - CURSOR 의 CLOSE
CLOSE 커서명;

FOR LOOP CURSOR

[문법]

FOR 변수명(select 되어진 행의 정보가 담기는 변수) IN 커서명 LOOP
	실행문장;
END LOOP;

커서의 속성변수

  1. 커서명%ISOPEN
    커서가 OPEN 되어진 상태인가를 체크하는 것
    만약에, 커서가 OPEN 되어진 상태이라면 TRUE

  2. 커서명%FOUND
    FETCH 된 레코드(행)이 있는지 체크하는 것
    만약에, FETCH 된 레코드(행)이 있으면 TRUE

  3. 커서명%NOTFOUND
    FETCH 된 레코드(행)이 없는지 체크하는 것
    만약에, FETCH 된 레코드(행)이 없으면 TRUE

  4. 커서명%ROWCOUNT
    현재까지 FETCH 된 레코드(행)의 갯수를 반환해줌


응용

-- 1단계. CURSOR 의 선언(정의)
cursor cur_empinfo
is
WITH E as
(
	select department_id
    	, employee_id
        , first_name || ' ' || last_name as ENAME
        , to_char(hire_date, 'yyyy-mm-dd') as HIREDATE
        , func_gender(jubun) as GENDER
        , func_age(jubun) as AGE
    from employees
    where department_id = p_department_id
)
select E.department_id, D.department_name, E.employee_id, E.ename
	, E.hiredate, E.gender, E.age
from departments D right join E
on D.department_id = E.department_id;

v_department_id		employees.department_id%type;
v_department_name	departments.department_name%type;
v_employee_id		employees.employee_id%type;
v_ename				varchar2(30);
v_hiredate			varchar2(10);
v_gender			varchar2(6);
v_age				number(3);

v_fetch_count		number := 0;

begin
	-- 2단계. CURSOR 의 OPEN
    OPEN cur_empinfo;
    -- 3단계. CURSOR 의 FETCH
    LOOP
    	FETCH cur_empinfo INTO v_department_id, v_department_name
        , v_ename, v_hiredate, v_gender, v_age;
        EXIT WHEN cur_empinfo%NOTFOUND;		
        -- 더이상 FETCH 되어진 행이 없으면 반복문을 빠져나감.
        v_fetch_count := cur_empinfo%ROWCOUNT;	
        -- 현재까지 FETCH 된 레코드 개수
        if(v_fetch_count = 1) then 
        	dbms_output.put_line(lpad('-',60,'-'));
            dbms_output.put_line
     ('부서번호	부서명	사원번호	사원명	입사일자	성별	나이');
            dbms_output.put_line(lpad('-',60,'-'));
        end if;
        dbms_output.put_line(v_department_id || ' ' ||
        v_department_name || ' ' || v_employee_id || ' ' ||
        v_ename || ' ' || v_hiredate || ' ' || v_gender || ' ' ||
        v_age);
  END LOOP;
  -- 4단계. CURSOR 의 CLOSE
  CLOSE cur_empinfo;
  
  if(v_fetch_count = 0) then
  	dbms_output.put_line('>> 부서번호 ' || p_department_id || '은
     존재하지 않습니다. <<');
  else
  	dbms_output.put_line(' ');
    dbms_output.put_line('>> 조회된 행의 개수 : ' || v_fetch_count
     || '개 <<');
  end if;
end pcd_employees_deptid_cursor;

0개의 댓글