본문 바로가기

DB/Oracle

[Oracle] ORA-06550 & EXCEPTION(예외처리)

ORA-06550: 호출 시 인수의 수나 유형이 잘못되었습니다.

오라클은 SP(Storde Procedure) 실행 시 인수(Parameter Variable 수)와 유형(Parameter Variable 데이터 타입)을 확인합니다. 

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

Exception(예외처리)

 

구문

 

DECLARE

-- 예외 선언

-- 예외 이름 EXCEPTION;

 

BEGIN

-- 예외 발생

-- RAISE 예외 이름;

 

EXCEPTION

-- 예외 처리

-- WHEN 예외 이름 THEN

-- 구문;

 

END;

 

예제

 

SET SERVEROUTPUT ON;

CREATE OR REPLACE PROCEDURE zeroDivide (p_fvalue NUMBER := 0, p_lvalue NUMBER := 0)
IS
BEGIN

            DBMS_OUTPUT.PUT_LINE('Value of fvalue / lvalue is ' || p_fvalue / p_lvalue);

EXCEPTION

            WHEN ZERO_DIVIDE THEN
                        DBMS_OUTPUT.PUT_LINE('0으로 나눌 수 없습니다!');
            WHEN OTHERS THEN
                        DBMS_OUTPUT.PUT_LINE('관리자에게 문의하세요.');

END;

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

오라클에서 제공하는 예외

ZERO_DIVDE : 0으로 나누는 경우

NO_DATA_FOUND : SELECT INTO 구문 실행 후 반환되는 행이 없는 경우

TOO_MANY_ROWS : SELECT INTO 구문이 하나 이상의 행을 반환하는 경우

VALUE_ERROR : 데이터의 변환 과정에서 오류나 선언된 변수가 데이터의 저장하기에 크기가 작은 경우

                              (예. NUMBER(2) := 100;)

NOT_LOGED_ON : Oracle에 접속하지 않은 채 데이터베이스를 Call하는 경우

INVALID_CURSOR : Cursor의 동작이 부절절한 경우 (예. Open하지 않은 Cursor를 닫는 경우)

CURSOR_ALREADY_OPEN : 이미 열려있는 Cursor가 열려고 하는 경우

DUP_VAL_ON_INDEX : Unique Index가 설정된 칼럼에 중복된 값을 입력하는 경우

 

사용자 정의 예외처리 구문

 

DECLARE

-- 예외선언

-- EXCEPTION 예외 이름;

 

BEGIN

-- 예외발생 (개발자가 실행의 적절한 곳에서 예외를 발생시켜 주어야 합니다.)

-- RAISE 예외 이름;

 

EXCEPTION

-- 예외 정의 (예외가 발생하면 이곳에서 예외 처리가 되고, 문장을 정상적으로 종료합니다.)

-- WHEN 예외이름 THEN 예외 처리 문장;

 

END

 

예제

CREATE OR REPLACE PROCEDURE info_Hiredate (p_syear IN CHAR := NULL, p_eyear IN CHAR := NULL)
IS
          l_emp employees%ROWTYPE;

          -- 커서의 선언

          CURSOR chkyear_cur IS
          SELECT employee_id, last_name, hire_date
          FROM employees
          WHERE TO_CHAR(hire_date, 'YYYY') BETWEEN p_syear AND p_eyear;

         -- 예외 선언

         -- exception_name EXCEPTION;

         chkyear_err EXCEPTION;

BEGIN

        -- 예외 발생

        -- RAISE exception_name;

        IF((p_year IS NULL) OR (p_year IS NULL)) THEN
                     RAISE chkyear_err;
        END IF;



       -- 커서 열기

       OPEN chkyear_cur;



       -- 커서로부터 데이터 읽기

       LOOP

                     FETCH chkyear_cur INTO l_emp.employee_id, l_emp.last_name, l_emp.hire_date;
                     EXIT WHEN chkyear_cur %NOTFOUND;
                     DBMS_OUTPUT.PUT_LINE(l_emp.employee_id || ' ' || l_emp.last_name || ' ' || l_emp.hire_date);

       END LOOP;



      -- 커서 닫기

      CLOSE chkyear_cur;



      EXCEPTION

      -- 예외 처리

      -- WHEN exception_name THEN statement;

      WHEN chkyear_err THEN
                     DBMS_OUTPUT.PUT_LINE('시작 연도 및 마감 연도의 값을 확인하세요.');

END info_Hiredate;

EXEC info_Hiredate()  -> 시작 년도 및 마감 년도의 값을 확인하세요