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() -> 시작 년도 및 마감 년도의 값을 확인하세요
'DB > Oracle' 카테고리의 다른 글
[Oracle] 사용자 정의 함수(Stored Function) (0) | 2022.08.23 |
---|---|
[Oracle] EXCEPTION(예외처리) 예제 (0) | 2022.08.22 |
[Oracle] 커서(Cursor) 예제들 (0) | 2022.08.11 |
[Oracle] 커서(Cursor) (0) | 2022.08.10 |
[Oracle] 테이블 생성 & 테이블,컬럼 Comment & 테이블 기본키 추가 & ORA-02437 & 테이블 컬럼타입 변경 (0) | 2022.08.02 |