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;

/


+ Recent posts