2015년 8월 27일 목요일

[PL/SQL예외]사전에정의된예외,Predefined Exception

[PL/SQL예외]사전에정의된예외,Predefined Exception

Predefined Exception

 오라클 서버에 사전에 정의된 예외, 자주 발생하므로 오라클 서버 오류번호와 예외명을 미리 매칭시켜 둔 것이다.

Exception Oracle Error SQLCODE Description
ACCESS_INTO_NULL 06530 -6530 NULL Object가 할당되는 경우
CASE_NOT_FOUND 06592 -6592 CASE문을 ELSE없이 사용시 WHEN절에 만족하는 경우가 없을 때
DUP_VAL_ON_INDEX 00001 -1 UNIQUE INDEX 중복오류
INVALID_CURSOR 01001 -1001 커서 조작 실수
INVALID_NUMBER 01722 -1722 숫자를 문자로 바꾸는 경우에 숫자로 바꿀수 없는 문자를 숫자로 바꾸는 경우
LOGIN_DENIED 01017 -1017 사용자명 or 비밀번호 맞지 않은 경우
NO_DATA_FOUND 01403 +100 SELECT 했는데 데이터가 한건도 추출되지 않는 경우
NOT_LOGGED_ON 01012 -1012 로그온 되지 않은 상황에서 SQL문을 실행했을 때
PROGRAM_ERROR 06501 -6501 PL/SQL 내부 오류
ROWTYPE_MISMATCH 06504 -6504 커서 패치하는 경우 데이터 타입이 불일치
STORAGE_ERROR 06500 -6500 PL/SQL등에서 OUT OF MEMORY 발생시
TOO_MANY_ROWS 01422 -1422 BEGIN내부에서 SELECT 사용시 여러건의 데이터가 추출되는 경우
VALUE_ERROR 06502 -6502 산술연산의 변환, 절삭, 사이즈 오류시 발생
ZERO_DIVIDE 01476 1476 숫자를 0으로 나누는 경우에 발생

-- 예외처리를 하지 않은 경우
SQL> create or replace procedure showempbyjob
    (v_job in emp.job%type)
    is
      v_ename emp.ename%type;
      v_sal emp.sal%type;
    begin
      select ename, sal
      into v_ename, v_sal
      from emp
      where job = v_job;
 
      dbms_output.put_line('이름'||'급여');
      dbms_output.put_line('--------------------');
      dbms_output.put_line(v_ename || v_sal);
  end;
  /
프로시저가 생성되었습니다.

SQL> exec showempbyjob('CLERK')
BEGIN showempbyjob('CLERK'); END;
*
1행에 오류:
ORA-01422: 실제 인출은 요구된 것보다 많은 수의 행을 추출합니다
ORA-06512: "SCOTT.SHOWEMPBYJOB",  7행
ORA-06512:  1행

-- 사전에 정의된 예외를 이용하여 예외처리를 한 경우
SQL> create or replace procedure showempbyjob
    (v_job in emp.job%type)
    is
      v_ename emp.ename%type;
      v_sal emp.sal%type;
    begin
      select ename, sal
      into v_ename, v_sal
      from emp
      where job = v_job;
 
      dbms_output.put_line('이름'||'급여');
      dbms_output.put_line('--------------------');
      dbms_output.put_line(v_ename || v_sal);
  exception
      when no_data_found then
        dbms_output.put_line('해당 직종의 사원은 없음...');
      when too_many_rows then
        dbms_output.put_line('해당 직종을 가진 사원이 2건 이상...');
      when others then
        dbms_output.put_line(SQLCODE || ':' || SQLERRM);
  end;
  /
프로시저가 생성되었습니다.

SQL>  exec showempbyjob('CLERK')
해당 직종을 가진 사원이 2건 이상...

-- 예외처리를 하지 않은 경우
SQL> create or replace procedure insertemp
    (v_empno in emp.empno%type,
    v_ename in emp.ename%TYPE,
    v_sal in emp.sal%TYPE)
    is
    begin
      insert into emp(empno, ename, sal) values (v_empno, v_ename, v_sal);
      commit;
    end;
  /
프로시저가 생성되었습니다.

SQL> exec insertemp(7369,'오자커',9999)
BEGIN insertemp(7369,'오자커',9999); END;
*
1행에 오류:
ORA-00001: 무결성 제약 조건(SCOTT.PK_EMP)에 위배됩니다
ORA-06512: "SCOTT.INSERTEMP",  7행
ORA-06512:  1행

-- 예외처리를 한 경우
SQL> create or replace procedure insertemp
    (v_empno in emp.empno%type,
    v_ename in emp.ename%TYPE,
    v_sal in emp.sal%TYPE)
    is
    begin
      insert into emp(empno, ename, sal) values (v_empno, v_ename, v_sal);
      commit;
    exception
    when dup_val_on_index then
      dbms_output.put_line('데이터가 중복 됩니다...');
  end;
  /
프로시저가 생성되었습니다.

SQL> set serverout on
SQL> exec insertemp(7368,'오자커736',9999)
데이터가 중복 됩니다... 

댓글 없음:

댓글 쓰기