GoalsError란? 예외처리, other 구문, Compilation Error함수 : 익명 블록, 저장 서브 프로그램,프로시저 생성, 실행, 확인, 삭제, 파라미터가 있는 프로시저, 프로시저 파라미터의 모드(mode)
Notes
Error란
(1) 컴파일 에러 (Compilation Error) : SQL 또는 PL/SQL 문법에 오류가 있어서 실행 자체가 되지 않는 오류. Exception 구문으로 해결 불가능.
(2) 실행중 에러 (Runtime Error) : 문법에 맞게 작성되어서 실행은 되지만, 실행 중 어떠한 이유로 발생하는 에러
-- 예외처리의 대상이 됨.
예외/오류 (exception / error) 처리
declare
ㄴ 선언부 : 변수 선언, 타입(record, collection) 선언, 커서 선언
begin
ㄴ 실행부 : 절차적으로 진행할 코드를 작성
exception
ㄴ 예외처리부 : 실행부(begin ~)의 코드들을 실행하다가 오류가 발생했을 때
그 예외를 처리하는 부분
when 예외1 then
예외1이 발생했을 때 처리할 코드;
when 예외2 then
예외2이 발생했을 때 처리할 코드;
...
※ 예외 이름을 모를 경우, 예외 이름이 없는 경우
when others then
처리할 코드들;
end;
-- 예외 처리 구문
declare
v_result number;
begin
dbms_output.put_line(' 예외 발생 전');
v_result := 'abc';
exception
when value_error then
dbms_output.put_line('숫자가 아닙니다');
end;
/
-- 만능에러처리방법 : OTHERS
declare
v_result number;
begin
dbms_output.put_line('예외 발생 전..');
v_result := 123/0;
dbms_output.put_line(v_result);
exception
when zero_divide then
dbms_output.put_line ('0으로 나눌 수 없습니다.');
when others then -- others : 나머지들. 항상 exception 구문에 가장 뒤에 와야 한다.
dbms_output.put_line('에러코드: '||sqlcode); -- sqlcode : 에러 코드
dbms_output.put_line('에러 메세지: '||sqlerrm); -- sqlerrm : 에러 메세지
end;
/
※ 컴파일 에러에 대해서는 예외처리할 수 없다.
- 익명(무명) 블록(anonymous block) : 이름을 지정하지 않은 PL/SQL 블록
- 이름이 없기 때문에 오라클 서버에 저장될 수 없다.
- Script 파일( *.sql )에는 저장 가능.
- 실행될 때마다 새로 컴파일 된다.
- 저장 서브 프로그램 ( Stored sub program ) : 이름이 있는 PL/SQL 블록
- 프로시저( Procedure ), 함수 ( Function ), 패키지 ( Package ), 트리거 ( Trigger )
- 오라클 서버에 저장되는 객체 ( Object ) --> 재사용 ( re-use ) 가능
- 서버에 저장될 때 컴파일 됨 --> 실행 속도가 빠름
- 프로시저 Procedure [ ] : 생략가능
create [or replace] precedure [프로시저이름( >> or replace : 프로시저 수정시
파라미터1 [mode] 타입,
파라미터2 [mode] 타입,
...
)] --> 세미콜론 없음, end 뒤에만 있음
is - 생략불가능
- 선언부 : 변수, 커서 선언
begin
- 실행부 : 절차적으로 처리할 코드들;
[exception]
end;
--프로시저 생성
create or replace procedure my_proc1
is
v_empno emp.empno%type := 7788;
v_ename emp.ename%type; -- in type : select into로 입력받음
begin
select ename into v_ename from emp where empno = v_empno;
dbms_output.put_line('이름: '||v_ename);
end;
/
-- 프로시저 실행
begin
my_proc1();
my_proc1; -- 파라미터를 갖지 않는 프로시저를 호출할 때는 ( ) 생략 가능
end;
/
--프로시저 확인
select * from user_source where name= upper ( 'my_proc1' ); -- 검색시 대문자로 검색해야 함
-- 프로시저 삭제
drop procedure my_proc1;
-- 파라미터를 갖는 프로시저 생성
create or replace procedure my_proc2(
p_empno emp.empno%type -- in Type : 입력받음
)
is
v_ename emp.ename%type;
begin
select ename into v_ename from emp where empno = p_empno;
dbms_output.put_line('name: '|| v_ename);
end;
/
--파라미터 있는 프로시저 실행
begin
my_proc2(7654);
end;
/
- 프로시저 파라미터의 모드(mode)
- in : 프로시저를 호출할 때 전달한 값을 저장하는 매개변수
- out : 프로시저를 호출한 곳으로 값을 반환할 때 사용하는 매개변수
- in out : 값을 전달받기도 하고, 반환하기도 하는 매개변수
- 프로시저 파라미터의 디폴트는 in이기 때문에, 보통 in은 생략한다.
-- in, out 모드 프로시저 선언
create or replace procedure my_proc3(
in_empno in emp.empno%type, -- in 모드 파라미터 : input할 값을 입력 -- 호출시 입력받음
out_ename out emp.ename%type, -- out모드 파라미터 : output 값을 받을 변수를 입력 -- select into로 입력받음. 호출시 변수
out_deptno out emp.deptno%type -- select into로 입력받음 -- 호출시 변수 필요
)
is -- 선언부의 코드가 없더라도 is는 생략하면 안 됨!
begin
select ename, deptno into out_ename, out_deptno
from emp
where empno = in_empno;
end;
/
-- 프로시저 실행
declare v_ename emp.ename%type;
v_deptno emp.deptno%type;
begin
my_proc3(7654, v_ename, v_deptno);
dbms_output.put_line(v_ename||', '||v_deptno);
end;
/
-- in out 모드 프로시저 선언
create or replace procedure my_proc4(
v_number in out number -- out type : 호출시 입력받을 변수입력
)
is
begin
v_number := 2 * v_number;
end;
/
declare
v_test number := 10;
begin
DBMS_OUTPUT.PUT_LINE('procedure 호출 전 v_ test = '|| v_test );
my_proc4(v_test); -- 프로시저 호출
DBMS_OUTPUT.PUT_LINE('procedure 호출 후 v_ test = '|| v_test );
end;
/
실행 결과
-- 기본값을 갖는 프로시저의 파라미터
create or replace procedure my_proc5(
param1 number, -- 기본값이 지정되지 않은 파라미터 -- 호출시 입력받음
param2 number := 123 -- 기본값이 지정된 파라미터 -- 호출시 입력받음
)
is
begin
dbms_output.put_line (param1 || ', '|| param2);
end;
/
begin
my_proc5(1); --> 1,123
end;
/
begin
my_proc5(1,2); --> 1,2
end;
/
--> 값을 안 줄 때에만 기본값이 사용된다.
/* 연습문제 프로시저 : get_total_sal
파라미터 :
p_empno - in 모드, emp테이블
p_tax - in 숫자 기본값 0.05
기능 : 전달받은 사번으로 셀러리sal와 커미션comm을 검색한다.
*/
-- 프로시저 선언
create or replace procedure get_total_sal(
p_empno in emp.empno%type, -- 호출시 입력받음
p_tax in number :=0.05 -- 호출시 입력받음
)
is -- emp 테이블에서 해당 사번의 급여(sal)와 상여금(comm)을 저장할 변수
v_sal emp.sal%type;
v_comm emp.comm%type;
v_total number;
begin
select sal, nvl(comm,0) into v_sal, v_comm from emp
where empno=p_empno;
v_total := (v_sal+ v_comm) * (1-p_tax);
dbms_output.put_line (v_sal||', ' || v_comm);
dbms_output.put_line ('total : '||v_total);
exception
when NO_DATA_FOUND then
dbms_output.put_line('없는 사번입니다');
p_total := 0;
when others then -- others : 나머지들. 항상 exception 구문에 가장 뒤에 와야 한다.
dbms_output.put_line('에러코드: '||sqlcode); -- sqlcode : 에러 코드
dbms_output.put_line('에러 메세지: '||sqlerrm); -- sqlerrm : 에러 메세지
end;
/
-- 프로시저 호출
begin
get_total_sal(7788);
end;
/
-- 실행 결과
-- 프로시저 호출2
begin
get_total_sal(7708);
end;
/
-- 실행 결과
-- 예외처리 하지 않을 경우
begin
get_total_sal(0000);
end;
/
'DB > Oracle' 카테고리의 다른 글
Oracle DB15_ 프로시저와 패키지 (0) | 2019.10.11 |
---|---|
Oracle DB13_VARRAY, 커서 (0) | 2019.10.07 |
Oracle DB12_레코드,연관배열 (0) | 2019.10.03 |
Oracle DB11_ 반복문 연습문제2 (0) | 2019.10.01 |
Oracle DB10_조건문/반복문 연습문제 (0) | 2019.09.30 |