--- ○ 배 열 (테이블 타입형 변수 - oracle에서)
--|| 배열을 쓰기위해서는 출력값이 저장될 변수를 테이블 타입형 변수로 정의를 해주어야 한다.
--|| 반복문 안에 들어갈 쿼리문을 미리 view로 생성해주면 좋다.
create or replace view v_emppay
as
select empno, ename, job, coalesce(sal*12+comm, sal*12, 0) "YEARPAY"
from EMP;

create or replace procedure p_empinfo2
(v_jik in varchar2)
is
  type empnotbltype is table of emp.empno%type index by binary_integer;
  -- type 테이블타입형변수명 is table of 데이타타입지정
  -- index by binary_integer는 쉽게 말해 변수에 들어갈 값들의 방번호를 의미한다.
  type enametbltype is table of emp.ename%type index by binary_integer;
  type jobtbltype is table of emp.job%type index by binary_integer;
  type yearpaytbltype is table of number index by binary_integer;
 
  v_empno empnotbltype;
  v_ename enametbltype;
  v_job jobtbltype;
  v_yearpay yearpaytbltype;
 
  i binary_integer := 0; -- 방번호로 사용할 변수지정 및 시작값 지정
begin
  for result in(select * from v_emppay where upper(job) = upper(v_jik)) loop
     -- for 변수 in다음에는 쿼리문을 넣을수 있고 이것은 해당 쿼리문의 결과값 row가 없으면
  -- for 문을 빠져나오게 된다.
  -- result(for문에 사용되는 변수)에 저장되는 값은 수식이 들어올수 없으므로
  -- 쿼리문을 넣을때는 항시 alias 처리를 해주어야 한다.
  i := i + 1;  --- 오라클에서 방시작은 1부터시작되기때문에 1로 맞추어 주어야 한다.
  v_empno(i) := result.empno;
  v_ename(i) := result.ename;
  v_job(i) := result.job;
  v_yearpay(i) := result.yearpay;
  -- 테이블타입형 변수에 값이 들어가기위해서는 방번호를 입력해야하는데
  -- 방번호 또한 변수가 되기때문에 위에서 방번호로 지정해준 binary_integ로
  -- 지정해주고 테이블타입형 변수()안에 넣어주면 된다.
     end loop;
    
     dbms_output.put_line('-------------------------------');
     dbms_output.put_line('사원번호   사원명   직종   연봉');
     dbms_output.put_line('-------------------------------');
    
     for s in 1..i loop
       dbms_output.put_line(v_empno(s) || '  ' || v_ename(s) || '  ' ||
              v_job(s)   || '  ' || v_yearpay(s));
     end loop;
end;
/
/* exec p_empinfo2('salesman') */
/* 이러한 프로시져를 사용하는것은 오라클서버에 부하를 좀더 줄이기 위해 사용한다. */
----------------------------------------------------------------------------------------
-----|| 연습문제 : exec p_empinfo3(부서명); 을 입력하면
--      부서번호  사원명  직급  연봉  이 출력되는 프로시져를 생성하시오.
create or replace view v_empjoin
as
select E.deptno, ename, job, coalesce(sal*12+comm, sal*12, 0) "YEARPAY"
from EMP E join dept D
on E.deptno = D.deptno;

select * from v_empjoin;
drop view v_empjoin;

create or replace procedure p_empinfo3
(v_buname in varchar2)
is
  type deptnotbltype is table of emp.deptno%type index by binary_integer;
  type enametbltype is table of emp.ename%type index by binary_integer;
  type jobtbltype is table of emp.job%type index by binary_integer;
  type yearpaytbltype is table of number index by binary_integer;
 
  v_deptno deptnotbltype;
  v_ename enametbltype;
  v_job jobtbltype;
  v_yearpay yearpaytbltype;
 
  i binary_integer := 0;
begin
  for result in(select * from v_empjoin
         where deptno = (select distinct D.deptno from emp E, dept D
                      where E.deptno = D.deptno and upper(D.dname) = upper(v_buname))) loop
   i := i + 1;
  v_deptno(i) := result.deptno;
  v_ename(i) := result.ename;
  v_job(i) := result.job;
  v_yearpay(i) := result.yearpay;
  end loop;
 
  dbms_output.put_line('-------------------------------');
     dbms_output.put_line('부서번호   사원명   직급   연봉');
     dbms_output.put_line('-------------------------------');

     for s in 1..i loop
       dbms_output.put_line(v_deptno(s) || '  ' || v_ename(s) || '  ' ||
              v_job(s)    || '  ' || v_yearpay(s));
     end loop; 
end;
/
/* exec p_empinfo3('sales') */
---↓ 선생님 풀이 ↓---
create or replace view v_empdname
as
select D.dname, D.deptno || '   ' ||
                rpad(E.ename,10) || ' ' ||
                rpad(E.job,10) || ' ' ||
                coalesce(E.sal*12+E.comm, E.sal*12, 0) sainfo
from emp E join dept D
on E.deptno=D.deptno;
    
select * from v_empdname;

create or replace procedure p_empinfo3
(v_dname in v_empdname.dname%type)
is
   type empinfotype
   is table of v_empdname.sainfo%type
   index by binary_integer;
  
   i binary_integer := 0;

   v_empinfo empinfotype;
begin

 for result in(select sainfo from v_empdname
               where upper(dname) = upper(v_dname)) loop
     i := i + 1;                  
     v_empinfo(i) := result.sainfo;                 
 end loop;                  

dbms_output.put_line('----------------------------');
dbms_output.put_line('부서번호 사원명  직종  연봉');
dbms_output.put_line('----------------------------');

for s in 1..i loop
  dbms_output.put_line(v_empinfo(s));
end loop;

end;
/
----------------------------------------------------------------------------------------

'Program... > Oracle' 카테고리의 다른 글

Oracle Trigger  (0) 2009.03.14
Oracle Procedure (Cursor, for loop Cursor)  (0) 2009.03.14
Oracle Procedure (loop, for loop)  (0) 2009.03.14
Oracle Function (함수생성)  (1) 2009.03.14
Oracle PL(Procedure Language)/SQL  (0) 2009.03.14
Posted by Duritz

공지사항

Yesterday
Today
Total
05-18 12:57

달력

 « |  » 2024.5
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31