declare
cursor emp_cur is
select empno, ename, job, sal
from emp
where deptno = 10;
rec_emp_cur emp_cur%rowtype;
begin
open emp_cur;
loop
fetch emp_cur into rec_emp_cur;
exit when emp_cur%notfound;
p(rec_emp_cur.job||', '||rec_emp_cur.ename||'('||rec_emp_cur.empno
||')''s salary is '||rec_emp_cur.sal);
end loop;
close emp_cur;
end;
/
문제) 급여가 2000 이상인 사원의 사원번호, 사원이름, 부서이름, 직급, 급여를
출력하는 pl/sql 문을 작성하세요.
단, 커서를 사용하셔야 합니다.
emp, dept 테이블을 사용하세요.
declare
커서 선언;
레코드 변수 선언;
begin
커서 오픈;
루프
커서 페치하여 레코드 변수에 저장;
커서 애트리뷰트를 이용한 탈출 조건;
화면 출력;
루프 종료;
end;
/
↓ ↓ ↓
declare
cursor c_ed is
select e.empno, e.ename, d.dname, e.job, e.sal
from emp e join dept d
on (e.deptno = d.deptno)
where e.sal >= 2000;
r_ed c_ed%rowtype;
begin
open c_ed;
loop
fetch c_ed into r_ed;
exit when c_ed%notfound;
p('부서이름: ' || r_ed.dname);
p('사원번호: ' || r_ed.empno || ', 사원이름: ' || r_ed.ename);
p('직 급: ' || r_ed.job || ', 급 여: ' || r_ed.sal);
p('----------------------------------------');
end loop;
close c_ed;
end;
/
* Loop를 이용한 Fetch: while 보다는 basic(건수를 알 수 없을 때)이나
cursor for loop(건수를 알 때)을 이용
declare
cursor emp_cur is
select empno, ename, job, sal
from emp
where deptno = 10;
v_empno emp.empno%type;
v_ename emp.ename%type;
v_job emp.job%type;
v_sal emp.sal%type;
-- w_switch boolean := true; --> 최초 진입을 위한 변수
begin
open emp_cur;
fetch emp_cur into v_empno, v_ename, v_job, v_sal;
while (emp_cur%found) loop --> cursor attribute를 이용한 while 조건 검증 까다로움
-- while (w_switch) loop
fetch emp_cur into
v_empno, v_ename, v_job, v_sal;
p(v_job||', '||v_ename||'('||v_empno||')''s salary is '||v_sal);
/* if emp_cur%notfound then
w_switch := false;
end if;
*/
end loop;
p(emp_cur%rowcount||' rows processed');
close emp_cur;
end;
/
↓ ↓ ↓
declare
cursor emp_cur is
select empno, ename, job, sal
from emp
where deptno = 10;
v_empno emp.empno%type;
v_ename emp.ename%type;
v_job emp.job%type;
v_sal emp.sal%type;
b_switch boolean := true; --> basic loop나 for loop를 쓰면 불필요한 변수
begin
open emp_cur;
while (b_switch) loop --> cursor attribute를 이용한 while 조건 검증 까다로움
fetch emp_cur into
v_empno, v_ename, v_job, v_sal;
if emp_cur%notfound then
b_switch := false;
else
p(v_job||', '||v_ename||'('||v_empno||')''s salary is '||v_sal);
end if;
end loop;
p(emp_cur%rowcount||' rows processed');
close emp_cur;
end;
/
declare
cursor emp_cur is
select empno, ename, job, sal
from emp
where deptno = 10;
v_empno emp.empno%type;
v_ename emp.ename%type;
v_job emp.job%type;
v_sal emp.sal%type;
begin
open emp_cur;
fetch emp_cur into v_empno, v_ename, v_job, v_sal;
while (emp_cur%found) loop --> cursor attribute를 이용한 while 조건 검증 까다로움
p(v_job||', '||v_ename||'('||v_empno||')''s salary is '||v_sal);
fetch emp_cur into
v_empno, v_ename, v_job, v_sal;
end loop;
p(emp_cur%rowcount||' rows processed');
close emp_cur;
end;
/
↓ ↓ ↓
declare
cursor emp_cur is
select empno, ename, job, sal
from emp
where deptno = 10;
v_empno emp.empno%type;
v_ename emp.ename%type;
v_job emp.job%type;
v_sal emp.sal%type;
begin
open emp_cur;
loop
fetch emp_cur into
v_empno, v_ename, v_job, v_sal;
exit when emp_cur%notfound;
p(v_job||', '||v_ename||'('||v_empno||')''s salary is '||v_sal);
end loop;
p(emp_cur%rowcount||' rows processed');
close emp_cur;
end;
/