--1.例外分类:预定义例外,非预定义例外,自定义例外
--2.处理例外:例外传递-->捕捉例外
--二.处理预定义例外
--见ORALCE预定义异常列表
--三.处理非预定义例外
--非预定义例外用来处理与预定义例外无关的ORACLE错误,若未处理,ORALCE错误传递给调用环境
--DEMO
SQL>SET SERVEROUTPUT ON
SQL>DECLARE
2--定义例外
3e_integrity EXCEPTION
4--关联例外与ORACLE错误
5PRAGMA EXCEPTION_INIT(e_integrity,-2291)
6 BEGIN
7UPDATE emp SET deptno=&dno WHERE empno=&eno
8 EXCEPTION
9--引用例外
10WHEN e_integrity THEN
11 dbms_output.put_line('该部门不歼禅伏存在')
12END
13 /
输入 dno 的值: 11
输入 eno 的值: 7788
原值7: UPDATE emp SET deptno=&dno WHERE empno=&eno
新值7: UPDATE emp SET deptno=11 WHERE empno=7788
该部门不存在
PL/SQL 过程已成功完成。
--四.处理自定义例外
--自定义例外处理处理与ORACLE错误无关,由开发人员为特定情况所定义的例外
--DEMO
SQL>SET SERVEROUTPUT ON
SQL>DECLARE
2--定义例外
3e_integrity EXCEPTION
4--关联例外与ORACLE错误
5PRAGMA EXCEPTION_INIT(e_integrity,-2291)
6
7--自定义例外
8e_no_employee EXCEPTION
9 BEGIN
10UPDATE emp SET deptno=&dno WHERE empno=&eno
11IF SQL%NOTFOUND THEN
12 RAISE e_no_employee
13END IF
14 EXCEPTION
15--引用例外
16WHEN e_integrity THEN
17 dbms_output.put_line('该部门不存在')
18WHEN e_no_employee THEN
19 dbms_output.put_line('该雇员不存在袭敬')
20END
21 /
输入 dno 的值: 10
输入 eno 的值: 1111
原值 10: UPDATE emp SET deptno=&dno WHERE empno=&eno
新值 10: UPDATE emp SET deptno=10 WHERE empno=1111
该雇员不存在氏携
PL/SQL 过程已成功完成。
--五.使用例外函数
--1.SQLCODE,SQLERRM
--SQLCODE用于返回ORACLE错误号
--SQLERRM用于返回该错误号所对应的错误消息
SQL>undef v_sal
SQL>DECLARE
2v_ename emp.ename%TYPE
3 BEGIN
4SELECT ename INTO v_ename FROM emp
5 WHERE sal=&&v_sal
6dbms_output.put_line('雇员名:'||v_ename)
7 EXCEPTION
8WHEN NO_DATA_FOUND THEN
9 dbms_output.put_line('不存在工资为:'||&v_sal||'的雇员')
10WHEN OTHERS THEN
11 dbms_output.put_line('错误号:'||SQLCODE)
12 dbms_output.put_line('错误信息:'||SQLERRM)
13 END
14 /
输入 v_sal 的值: 9876
原值5: WHERE sal=&&v_sal
新值5: WHERE sal=9876
原值9: dbms_output.put_line('不存在工资为:'||&v_sal||'的雇员')
新值9: dbms_output.put_line('不存在工资为:'||9876||'的雇员')
不存在工资为:9876的雇员
PL/SQL 过程已成功完成。
--2.RAISE_APPLICATION_ERROR在PL/SQL应用程序中自定义错误消息
--该过程只能在数据库端的子程序中执行,而不能在匿名块或客户端的子程序中使用
--语法:raise_application_error(error_number,message[,{TRUE,FALSE}])
--error_number:定义错误号,错误号必须是在-20000至-20999之间的负整数
--message:指定错误消息
--TRUE:该错误会与之前的错误一起放在堆栈中保存
--FALSE:默认值,替换先前的所有错误
--DEMO
SQL>CREATE or REPLACE PROCEDURE raise_comm
2(eno NUMBER,commission NUMBER)
3 IS
4v_comm emp.comm%TYPE
5 BEGIN
6SELECT comm INTO v_comm FROM emp WHERE empno=eno
7IF v_comm IS NULL THEN
8 RAISE_APPLICATION_ERROR(-20001,'该雇员无补助')
9END IF
10 EXCEPTION
11WHEN NO_DATA_FOUND THEN
12 dbms_output.put_line('该雇员不存在')
13 END
14 /
紧急放行是生产产品过程中因某种原因缺搜颂少某个过程确认而不影响产品质量的产品为了达到预期用途而采用的放行方式。例外放行是,产品各个生产程序都具备,世弯郑产品以确保合格,但没有某种原因没有出厂闹此手续,但客户要急用,所以必须放行。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)