[문법]
- 1단계 - CURSOR 의 선언(정의)
CURSOR 커서명 IS SELECT 문;
- 2단계 - CURSOR 의 OPEN
OPEN 커서명;
- 3단계 - CURSOR 의 FETCH
-> FETCH 란 ? SELECT 되어진 결과물을 끄집어 내는 작업FETCH 커서명 INTO 변수;
- 4단계 - CURSOR 의 CLOSE
CLOSE 커서명;
[문법]
FOR 변수명(select 되어진 행의 정보가 담기는 변수) IN 커서명 LOOP 실행문장; END LOOP;
커서명%ISOPEN
커서가 OPEN 되어진 상태인가를 체크하는 것
만약에, 커서가 OPEN 되어진 상태이라면 TRUE
커서명%FOUND
FETCH 된 레코드(행)이 있는지 체크하는 것
만약에, FETCH 된 레코드(행)이 있으면 TRUE
커서명%NOTFOUND
FETCH 된 레코드(행)이 없는지 체크하는 것
만약에, FETCH 된 레코드(행)이 없으면 TRUE
커서명%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;