- 전체
- Sample DB
- database modeling
- [표준 SQL] Standard SQL
- G-SQL
- 10-Min
- ORACLE
- MS SQLserver
- MySQL
- SQLite
- postgreSQL
- 데이터아키텍처전문가 - 국가공인자격
- 데이터 분석 전문가 [ADP]
- [국가공인] SQL 개발자/전문가
- NoSQL
- hadoop
- hadoop eco system
- big data (빅데이터)
- stat(통계) R 언어
- XML DB & XQuery
- spark
- DataBase Tool
- 데이터분석 & 데이터사이언스
- Engineer Quality Management
- [기계학습] machine learning
- 데이터 수집 및 전처리
- 국가기술자격 빅데이터분석기사
- 암호화폐 (비트코인, cryptocurrency, bitcoin)
ORACLE PL/SQL의 에러 처리방법
2013.12.27 19:54
[출처] http://radiocom.kunsan.ac.kr/lecture/oracle/plsql/plsql_exception.html
PL/SQL의 에러 처리방법
PL/SQL 블럭 내에서 SQL문을 정상적으로 처리하지 못하여 발생하는 오류는 프로그램내에 에러를 직접 처리해 주어야 한다.
PL/SQL 블럭 내에 사용된 SQL문의 에러 처리는 EXCEPTION절에 정의하면 된다.
declare
....
begin
....
exception
....
end; |
미리 정의된 에러 처리방법
오라클에서 제공하는 예측하여 정의한 오류 목록은 다음과 같다.
| 항목 | 에러 코드 | 설명 |
|---|---|---|
| NO_DATE_FOUND | ORA-01403 | SQL문에 의한 검색조건을 만족하는 결과가 전혀 없는 조건의 경우 |
| NOT_LOGGED_ON | ORA-01012 | 데이터베이스에 연결되지 않은 상태에서 SQL문 실행하려는 경우 |
| TOO_MANY_ROWS | ORA-01422 | SQL문의 실행결과가 여러 개의 행을 반환하는 경우, 스칼라 변수에 저장하려고 할 때 발생 |
| VALUE_ERROR | ORA-06502 | PL/SQL 블럭 내에 정의된 변수의 길이보다 큰 값을 저장하는 경우 |
| ZERO_DEVIDE | ORA-01476 | SQL문의 실행에서 컬럼의 값을 0으로 나누는 경우에 발생 |
| INVALID_CURSOR | ORA-01001 | 잘못 선언된 커서에 대해 연산이 발생하는 경우 |
| DUP_VAL_ON_INDEX | ORA-00001 | 이미 입력되어 있는 컬럼 값을 다시 입력하려는 경우에 발생 |
【예제】 $ vi zz.sql
CREATE OR REPLACE PROCEDURE test
(v_sal IN emp.sal%TYPE)
IS
v_ename emp.ename%TYPE;
BEGIN
SELECT ename INTO v_ename FROM emp WHERE sal=v_sal;
dbms_output.put_line('He id '¦¦ v_ename ¦¦'!!!!');
EXCEPTION
WHEN no_data_found THEN
raise_application_error(-20002,'Data not found....');
WHEN too_many_rows THEN
raise_application_error(-20003,'Too Many Rows....');
WHEN others THEN
raise_application_error(-20004,'Others Error....');
END;
/ |
미리 정의되지 않은 에러 처리방법 미리 정의된 에러 처리방법외에 사용자가 직접 에러 처리에 대한 논리적 흐름을 구현할 수 있다.
[PRAGMA EXCEPTION]절은 오라클 서버에서 어떤 에러 코드가 발생할 때 정의한 조건명을 지정할 것인지를 정의하는 절이다.
【예제】 $ vi zz.sql
create or replace procedure hire_emp
(v_emp_name IN emp.ename%type,
v_emp_job IN emp.job%type,
v_mgr_no IN emp.mgr%type,
v_emp_hiredate IN emp.hiredate%TYPE,
v_emp_sal IN emp.sal%type,
v_emp_comm IN emp.comm%type,
v_dept_no IN emp.deptno%type)
IS
e_invalid_mgr exception;
pragma exception_init (e_invalid_mgr, -02291);
BEGIN
INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm,deptno)
values(emp_id.nextval, v_emp_name, v_emp_job,v_mgr_no, v_emp_hiredate,
v_emp_sal, v_emp_comm, v_dept_no);
commit work;
exception
when e_invalid_mgr then
raise_application_error(-20201, 'Deptno is not a valid department.');
end hire_emp;
/ |
사용자가 정의한 에러 처리방법
사용자가 미리 에러에 대한 정의를 하는 경우이며, EXCEPTION 키워드에 의해 에러 조건명을 정의하고 RAISE 명령어에 의해 에러가 발생되면 exception 절에서 에러가 처리된다.
【예제】 $ vi test5.sql
create or replace procedure test5
(v_sal IN emp.sal%TYPE)
IS
v_low_sal emp.sal%type := v_sal - 100;
v_high_sal emp.sal%type := v_sal + 100;
v_no_emp number(7,2);
e_no_emp_returned exception;
e_more_than_one_emp exception;
begin
select count(ename) into v_no_emp from emp
where sal between (v_sal - 100) and (v_sal + 100);
if v_no_emp = 0 then
raise e_no_emp_returned;
elsif v_no_emp > 0 then
raise e_more_than_one_emp;
end if;
exception
when e_no_emp_returned then
dbms_output.put_line('There is no employee salary...');
when e_more_than_one_emp then
dbms_output.put_line('There is a row employee....');
when others then
dbms_output.put_line('Any other error occurred......');
end;
/ |
예외 trapping 함수
이 방법은 사용자가 실행한 SQL 문이 실행될 때 어떤 에러 코드와 에러 메시지가 발생하는지를 사용자가 직접 참조하여 처리하는 방법이다.
SQL 문을 실행한 후, SQLCODE 함수를 참조해 보면 SQL문의 실행 결과를 알 수 있다.
SQLCODE값의 이미는 다음과 같다.
| 0 | 에러 없이 정상적으로 실행되었음을 의미 |
|---|---|
| 1 | 사용자가 정의한 에러가 발생했음을 의미 |
| +100 | 조건을 만족하는 행이 없음을 의미 |
| 양수값 | 다른 오라클 에러가 발생했음을 의미 |
【예제】 $ vi test7.sql
CREATE OR REPLACE PROCEDURE test7
(v_sal IN emp.sal%TYPE)
IS
v_ename emp.ename%TYPE;
v_err_code number;
v_err_message varchar(255);
begin
select ename into v_ename from emp
where sal = v_sal;
dbms_output.put_line('He is '¦¦ v_ename ¦¦ '....');
exception
WHEN no_data_found THEN
v_err_code := SQLCODE;
v_err_message := SQLERRM;
dbms_output.put_line(v_err_code ¦¦ ' ' ¦¦ v_err_message);
WHEN too_many_rows THEN
raise_application_error(-2003, 'Too Many Rows...');
WHEN others THEN
raise_application_error(-2004, 'Others Error...');
END;
/ |
본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.

