RAISE_APPLICATION_ERROR 的语法如下:
RAISE_APPLICATION_ERROR(error_number,error_message,[keep_errors] );
- error_number:从 –20,000 到 –20,999 之间的参数,
- error_message:是相应的提示信息(< 2048 字节),
- keep_errors:可选,如果keep_errors =TRUE ,则新错误将被添加到已经引发的错误列表中。如果keep_errors=FALSE(缺省),则新错误将替换当前的错误列表。
例:创建一个函数get_salary, 该函数检索指定部门的工资总和,其中定义了-20991和-20992号错误,分别处理参数为空和非法部门代码两种错误:
CREATE OR REPLACE FUNCTION get_salary(p_deptno NUMBER) #函数检索指定部门的工资总和 RETURN NUMBER AS v_sal NUMBER; #函数get_salary返回v_sal值 BEGIN IF p_deptno IS NULL THEN RAISE_APPLICATION_ERROR(–20991, '部门代码为空'); #用户定义的异常处理 ELSIF p_deptno<0 THEN RAISE_APPLICATION_ERROR(–20992, '无效的部门代码'); ELSE SELECT SUM(employees.salary) INTO v_sal FROM employees WHERE employees.department_id=p_deptno; RETURN v_sal; END IF;
调用函数
DECLARE V_salary NUMBER(7,2); V_sqlcode NUMBER; V_sqlerr VARCHAR2(512); Null_deptno EXCEPTION; #定义异常情况 Invalid_deptno EXCEPTION; #定义异常情况 PRAGMA EXCEPTION_INIT(null_deptno,–20991); #非预定义的异常,将它与oracle错误联系起来 PRAGMA EXCEPTION_INIT(invalid_deptno, –20992); #非预定义的异常,将它与oracle错误联系起来 BEGIN BEGIN V_salary :=get_salary(–10); EXCEPTION WHEN invalid_deptno THEN V_sqlcode :=SQLCODE; V_sqlerr :=SQLERRM; INSERT INTO errlog(errcode, errtext) VALUES(v_sqlcode, v_sqlerr); #将错误SQLCODE及SQLERRM存入到表errlog中 COMMIT; END ;
例:定义触发器,使用RAISE_APPLICATION_ERROR阻止没有员工姓名的新员式记录插入:
CREATE OR REPLACE TRIGGER tr_insert_emp BEFORE INSERT ON employees FOR EACH ROW BEGIN IF :new.first_name IS NULL OR :new.last_name is null THEN RAISE_APPLICATION_ERROR(–20000,‘Employee must have a name.‘); END IF;
到此这篇关于Oracle对PL/SQL异常处理的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。