코드 :
--2026_1_14일 자습시간 문제
--오늘의 마지막 문제1. (이수자 평가 8번 제출물 문제)
--아래의 SQL을 자동화 할 수 있도록 프로시져로 생성하시오
select job,
sum(decode( to_char(hiredate,'RRRR'),'1980', sal, null) ) as "1980",
sum(decode( to_char(hiredate,'RRRR'),'1981', sal, null) ) as "1981",
sum(decode( to_char(hiredate,'RRRR'),'1982', sal, null) ) as "1982",
sum(decode( to_char(hiredate,'RRRR'),'1983', sal, null) ) as "1983"
from emp
group by job;
CREATE OR REPLACE PROCEDURE pivot_job_year_sumsal
( p_x OUT sys_refcursor )
IS
l_query VARCHAR2(400) := 'SELECT job ';
BEGIN
FOR x IN ( select distinct to_char(hiredate,'RRRR') year from emp order by 1 ) LOOP
l_query := l_query || ', sum( decode( to_char(hiredate, ''RRRR''),''' || x.year || ''', sal, null )) as "'|| x.year ||'"';
END LOOP;
l_query := l_query || ' FROM emp GROUP BY job ';
dbms_output.put_line( l_query );
OPEN p_x FOR l_query;
END;
/
variable x refcursor;
exec pivot_job_year_sumsal(:x);
print x;
코드 :
--오늘의 마지막 문제2. 아래의 프로시져를 패키지로 만들어서 실행하시오
--원본
create or replace procedure pro_telecom
( p_telecom dba22.telecom%type)
is
cursor emp_cursor is
select ename, age, telecom
from dba22
where telecom = p_telecom;
begin
for emp_record in emp_cursor loop
dbms_output.put_line( emp_record.ename || chr(9) ||
emp_record.age || chr(9) ||
emp_record.telecom );
end loop;
end;
/
exec pro_telecom('kt');
--패키지로 수정 후
create or replace PACKAGE pck_dba22
is
procedure pro_telecom( p_telecom dba22.telecom%type);
end;
/
create or replace PACKAGE body pck_dba22
is
procedure pro_telecom ( p_telecom dba22.telecom%type)
is
cursor emp_cursor is
select ename, age, telecom
from dba22
where telecom = p_telecom;
begin
for emp_record in emp_cursor loop
dbms_output.put_line( emp_record.ename || chr(9) ||
emp_record.age || chr(9) ||
emp_record.telecom );
end loop;
end;
end;
/
exec pck_dba22.pro_telecom('kt');