함수 만들기
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;
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;
create or replace function func_retirement_day
(p_jubun IN varchar2)
return date
is
v_retirement_day date;
begin
select last_day(to_date(to_char(add_months(sysdate,(63 - func_age('9606192111111') ) * 12), 'yyyy') ||
case when substr('9606192111111',3,2) between '03' and '08' then '-08-01' else '-02-01' end,'yyyy-mm-dd'))
into v_retirement_day
from dual;
return v_retirement_day;
end func_retirement_day;
select func_retirement_day('620101234567')
from dual;
예외처리 프로시저 만들기
begin 실행부에
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('>> 사원번호 ' || p_employee_id || '은 존재하지 않습니다.<<');
로 예외처리를 넣는다.
create or replace procedure pcd_employees_info
(p_employee_id in employees.employee_id%type)
is
v_employee_id employees.employee_id%type;
v_deptname departments.department_name%type;
v_mgrname varchar2(30);
v_empname varchar2(30);
v_hire_date varchar2(10);
v_gender varchar2(6);
v_age number(3);
begin
with v as
(
select
A.department_id,
department_name as dept_name,
first_name || ' ' || last_name as dept_king_name
from departments A join employees B
ON A.manager_id = B.employee_id
)
select
e.employee_id as 사원번호,
nvl(dept_name, ' ') AS 부서명,
nvl(dept_king_name,' ') AS 부서장명,
e.first_name || ' ' || e.last_name as 사원명,
to_char(hire_date, 'yyyy-mm-dd') as 입사일자,
func_gender(jubun) AS 성별,
func_age(jubun) AS 나이
INTO
v_employee_id, v_deptname, v_mgrname, v_empname, v_hire_date, v_gender, v_age
from employees e left join v
ON v.department_id = e.department_id
WHERE e.employee_id = p_employee_id;
dbms_output.put_line( lpad('-',60,'-') );
dbms_output.put_line( '사원번호 부서명 부서장명 사원명 입사일자 성별 나이' );
dbms_output.put_line( lpad('-',60,'-') );
dbms_output.put_line( v_employee_id || ' ' ||
v_deptname || ' ' ||
v_mgrname || ' ' ||
v_empname || ' ' ||
v_hire_date || ' ' ||
v_gender || ' ' ||
v_age );
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('>> 사원번호 ' || p_employee_id || '은 존재하지 않습니다.<<');
end pcd_employees_info;
exec pcd_employees_info(101);
exec pcd_employees_info(337);
사용자 정의 예외처리
------------ ***** 사용자 정의 예외절(EXCEPTION) ***** ----------------
예외절 = 오류절
※ 형식
exception
when 익셉션이름1 [or 익셉션이름2] then
실행문장1;
실행문장2;
실행문장3;
when 익셉션이름3 [or 익셉션이름4] then
실행문장4;
실행문장5;
실행문장6;
when others then
실행문장7;
실행문장8;
실행문장9;
------------------------------------------------------------------
SELECT TO_CHAR(sysdate,'d')
FROM dual;
create or replace procedure pcd_tbl_member_test1_insert
(p_userid IN tbl_member_test1.userid%type
,p_passwd IN tbl_member_test1.passwd%type
,p_name IN tbl_member_test1.name%type)
is
v_passwd_length number(2);
v_ch varchar2(1);
v_flag_alphabet number(1) := 0;
v_flag_number number(1) := 0;
v_flag_special number(1) := 0;
error_insert exception;
error_dayTime exception;
begin
if( to_char(sysdate, 'd') in('1','7') OR
to_number(to_char(sysdate, 'hh24')) < 14 OR
to_number(to_char(sysdate, 'hh24')) > 16 ) then
raise error_dayTime;
else
v_passwd_length := length(p_passwd);
if( v_passwd_length < 5 or v_passwd_length > 20 ) then
raise error_insert;
else
for i in 1..v_passwd_length loop
v_ch := substr(p_passwd, i, 1);
if(v_ch between 'A' and 'Z') OR (v_ch between 'a' and 'z') then
v_flag_alphabet := 1;
elsif(v_ch between '0' and '9') then
v_flag_number := 1;
else
v_flag_special := 1;
end if;
end loop;
if(v_flag_alphabet * v_flag_number * v_flag_special = 1) then
insert into tbl_member_test1(userid, passwd, name) values(p_userid, p_passwd, p_name);
else
raise error_insert;
end if;
end if;
end if;
exception
when error_dayTime then
raise_application_error(-20003, '>> 영업시간(월~금 14:00 ~ 16:59:59 까지)이 아니므로 입력불가함!! <<');
when error_insert then
raise_application_error(-20002, '>> 암호는 최소 5글자 이상이면서 영문자 및 숫자 및 특수기호가 혼합되어져야 합니다. <<');
end pcd_tbl_member_test1_insert;
exec pcd_tbl_member_test1_insert('eomjh','qwer1234$','엄정화');
exec pcd_tbl_member_test1_insert('eomjh','qwer1234$','엄정화');
commit;
select *
from tbl_member_test1;
exec pcd_tbl_member_test1_insert('hongkd','qwer1234$','홍길동');
exec pcd_tbl_member_test1_insert('eomjh','a3$','유관순');
exec pcd_tbl_member_test1_insert('eomjh','abc1234','유관순');