게시일: Nov 23, 2011 3:58:0 AM
- 구문 형식
create or replace procedure 프로시저명 ( 파라미터1 데이터타입 [in | out | in out]
, 파라미터2 데이터타입 [in | out | in out]
...
...
, 파라미터n 데이터타입 [in | out | in out]
)
is [as]
변수 선언부;
begin
처리 로직;
exception
예외처리;
end;
☞ 파라미터를 명시할 때 구체적인 자리수는 지정하지 않는다.
varchar2(20) 인 경우라도 varchar2 로 명시. 자리수 지정시 오류 발생
- 프로시저 실행
exec(cute) 프로시저명(파라미터1, 파라미터2, ... 파라미터n);
- 프로시저 작성 예제
create or replace procedure emp_transfer ( EMD_ID number
, TRANS_DEPT number
, TRANS_JOB_ID varchar2
, UP_SALARY number
)
is
NEW_DEPT_ID EMPLOYEES.DEPARTMENT_ID%type;
NEW_JOB_ID EMPLOYEES.JOB_ID%type;
MAX_SALARIES JOBS.MAX_SALARY%type;
MIN_SALARIES JOBS.MAX_SALARY%type;
-- 사용자 정의 예외(exception)
SALARY_TOO_HIGN exception
SALARY_TOO_LOW exception
begin
if TRANS_DEPT_ID is not null then
NEW_DEPT_ID := TRANS_DEPT_ID;
end if;
if TRANS_JOB_ID is not null then
select JOB_ID
, MAX_SALARY
, MIN_SALARY
into NEW_JOB_ID
, MAX_SALARIES
, MIN_SALARIES
from JOBS
where JOB_ID = TRANS_JOB_ID;
if UP_SALARY > MAX_SALARIES then
raise SALARY_TOO_HIGN; -- 사용자 정의 예외(exception) 발생
elsif UP_SALARY > MIN_SALARIES then
raise SALARY_TOO_LOW; -- 사용자 정의 예외(exception) 발생
end if;
end if;
update EMPLOYEES
set DEPARTMENT_ID = nvl(NEW_DEPT_ID, DEPARTMENT_ID)
, JOB_ID = nvl(NEW_JOB_ID , JOB_ID)
, SALARY = nvl(UP_SALARY , SALARY)
where EMPLOYEE_ID = EMP_ID;
commit;
exception
when SALARY_TOO_HIGN then
dbms_output.put_line('So high!!!');
rollback;
when SALARY_TOO_HIGN then
dbms_output.put_line('So low!!!');
rollback;
when others then
dbms_output.put_line(SQLERRM);
rollback;
end;
- 프로시저 삭제
drop procedure 프로시저명;