사용자 정의 함수 작성

실습
create or replace function func_gender
(p_jubun IN varchar2)
return varchar2
is
v_result varchar2(6);
begin
select case when substr(p_jubun, 7, 1) in('1','3') then '남' else '여' end
INTO
v_result
from dual;
return v_result;
end func_gender;
select
FUNC_GENDER('9010201234567'),
FUNC_GENDER('9010202234567'),
FUNC_GENDER('9010203234567'),
FUNC_GENDER('9010204234567')
from dual;
select
employee_id AS 사원번호,
first_name || ' ' || last_name AS 사원명,
jubun AS 주민번호,
FUNC_GENDER(jubun) AS 성별
from employees
order by 1;
select *
from employees
where FUNC_GENDER(jubun) = '여';
create or replace function func_gender_2
(p_jubun IN varchar2)
return varchar2
is
v_result varchar2(6);
begin
v_result := case when substr(p_jubun, 7, 1) in('1','3') then '남' else '여' end;
return v_result;
return v_result;
end func_gender_2;
select
FUNC_GENDER_2('9010201234567'),
FUNC_GENDER_2('9010202234567'),
FUNC_GENDER_2('9010203234567'),
FUNC_GENDER_2('9010204234567')
from dual;
select
employee_id AS 사원번호,
first_name || ' ' || last_name AS 사원명,
jubun AS 주민번호,
FUNC_GENDER(jubun) AS 성별1,
FUNC_GENDER_2(jubun) AS 성별2
from employees
order by 1;
create or replace function func_age
(p_jubun IN varchar2)
return number
is
v_age number(3);
begin
select case when to_date(to_char(sysdate, 'yyyy') || substr(p_jubun, 3, 4), 'yyyymmdd') - to_date(to_char(sysdate, 'yyyymmdd'), 'yyyymmdd') > 0
then extract(year from sysdate) - (to_number(substr(p_jubun,1,2)) + case when substr(p_jubun,7,1) in('1','2') then 1900 else 2000 end ) - 1
else extract(year from sysdate) - (to_number(substr(p_jubun,1,2)) + case when substr(p_jubun,7,1) in('1','2') then 1900 else 2000 end )
end
INTO
v_age
from dual;
return v_age;
end func_age;
select
func_age('9010201234567'),
func_age('9010202234567'),
func_age('9010203234567'),
func_age('9010204234567')
from dual;
select
employee_id AS 사원번호,
first_name || ' ' || last_name AS 사원명,
jubun AS 주민번호,
FUNC_GENDER(jubun) AS 성별1,
FUNC_GENDER_2(jubun) AS 성별2,
func_age(jubun) AS 만나이
from employees
order by 1;
create or replace function func_age_2
(p_jubun IN varchar2)
return number
is
v_age number(3);
begin
v_age := case when to_date(to_char(sysdate, 'yyyy') || substr(p_jubun, 3, 4), 'yyyymmdd') - to_date(to_char(sysdate, 'yyyymmdd'), 'yyyymmdd') > 0
then extract(year from sysdate) - (to_number(substr(p_jubun,1,2)) + case when substr(p_jubun,7,1) in('1','2') then 1900 else 2000 end ) - 1
else extract(year from sysdate) - (to_number(substr(p_jubun,1,2)) + case when substr(p_jubun,7,1) in('1','2') then 1900 else 2000 end )
end;
return v_age;
end func_age_2;
select
func_age('9010201234567'),
func_age('9010202234567'),
func_age('9010203234567'),
func_age('9010204234567')
from dual;
select
employee_id AS 사원번호,
first_name || ' ' || last_name AS 사원명,
jubun AS 주민번호,
func_age(jubun) AS 만나이,
func_age_2(jubun) AS 만나이
from employees
order by 1;
select
employee_id AS 사원번호,
first_name || ' ' || last_name AS 사원명,
jubun AS 주민번호,
FUNC_GENDER(jubun) AS 성별,
func_age(jubun) AS 만나이
from employees
where (trunc(func_age(jubun),-1) = 20 AND FUNC_GENDER(jubun) = '여')
OR (trunc(func_age(jubun),-1) = 20 AND FUNC_GENDER(jubun) = '남')
order by 성별,만나이;