Oracle专题13之异常错误处理

前端之家收集整理的这篇文章主要介绍了Oracle专题13之异常错误处理前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1、异常处理的概念与分类

a、什么是异常?

  • 异常:是程序在正常执行过程中发生的未预料的事件。

b、什么是异常处理?

  • 异常处理是为了提高程序的健壮性,使用异常处理部分可以有效地解决程序正常执行过程中可能出现的各种错误,使得程序正常运行。

c、异常处理的语法格式

  1. EXCEPTION
  2. WHEN first_exception THEN
  3. statement1;
  4. ......
  5. WHEN second_exception THEN
  6. statement1;
  7. ......
  8. WHEN OTHERS THEN
  9. statement1;
  10. ......

d、异常处理代码的PL/sql块中的位置

  1. DECLARE
  2. /*
  3. * 声明部分--声明变量、常量、复杂数据类型、游标等
  4. */
  5. BEGIN
  6. /*
  7. * 执行部分--PL/sql语句和sql语句
  8. */
  9. EXCEPTION
  10. /*
  11. * 异常处理部分--处理运行错误
  12. */
  13. END; --块结束标记
  • 简单示例代码查询指定部门的所有员工姓名和工资。
  1. DECLARE
  2. v_name emp.ename%TYPE;
  3. v_sal emp.sal%TYPE;
  4. BEGIN
  5. SELECT ename,sal INTO v_name,v_sal FROM emp WHERE empno = &no;
  6. IF v_sal < 3000 THEN
  7. dbms_output.put_line(v_name || '的工资是:' || v_sal);
  8. END IF;
  9. EXCEPTION
  10. WHEN NO_DATA_FOUND THEN
  11. dbms_output.put_line('员工号输入错误!');
  12. WHEN OTHERS THEN
  13. dbms_output.put_line('其他错误!');
  14. END;

e、异常的分类

  • 预定义异常、非预定义异常和自定义异常

2、预定义异常

  • 预定义异常是指由PL/sql所提供的系统异常,Oracle提供了20多个预定义异常,每个预定义异常对应一个特定的Oracle错误,当PL/sql块出现这些Oracle错误时,会隐含地触发相应的预定义异常。
  • 对于预定义异常情况的处理,无需在程序中定义,只需要在PL/sql块中的异常处理部分,直接引用相应的异常情况名,并对其完成相应的异常错误处理即可。
  • 示例代码:根据输入的工资,查询员工的姓名。并输出员工的姓名以及工资。
  1. DECLARE
  2. v_name emp.ename%TYPE;
  3. v_sal emp.sal%TYPE := &salary;
  4. BEGIN
  5. SELECT ename INTO v_name FROM emp WHERE sal = v_sal;
  6. DBMS_OUTPUT.put_line(v_name || '的工资是:' || v_sal);
  7. EXCEPTION
  8. WHEN NO_DATA_FOUND THEN
  9. DBMS_OUTPUT.put_line('没有该工资的员工');
  10. WHEN TOO_MANY_ROWS THEN
  11. DBMS_OUTPUT.put_line('多个员工具有该工资');
  12. WHEN OTHERS THEN
  13. DBMS_OUTPUT.put_line('其他错误');
  14. END;

3、非预定义异常

  • 用于处理预定义异常所不能够处理的ORACLE错误,此种异常需要在程序中定义。

a、非预定义异常的处理包括3步

1、在PL/sql块中定义部分定义异常情况:<异常情况> EXCEPTION; 2、将其定义好的异常情况与标准的ORACLE错误联系起来,使用PRAGMA EXCEPTION_INIT语句:PRAGMA EXCEPTION_INIT(<异常情况>,<错误代码>); 3、在PL/sql块的异常情况处理部分对异常情况做出相应的处理。

b、代码演示

  • 删除dept表中指定部分的信息。(删除部门时应该保证指定部门中没有员工,因为dept和emp表存在主外键关系) 1、当删除有其员工的部门时,获取错误号:
  1. BEGIN
  2. DELETE FROM dept WHERE deptno = &amp;deptno;
  3. EXCEPTION
  4. WHEN OTHERS THEN
  5. dbms_output.put_line(sqlCODE || '###' || sqlERRM);
  6. END;
  • 当按F8执行,键入20后,控制台打印如下内容
  1. -2292###ORA-02292: 违反完整约束条件 (SCOTT.FK_DEPTNO) - 已找到子记录

2、删除dept表中指定部分的信息:

  1. DECLARE
  2. --1、定义非预定义异常的标识符
  3. e_fk EXCEPTION;
  4. --2、把Oracle错误和异常信息建立关联
  5. -- -2292 违反外键约束的错误
  6. PRAGMA EXCEPTION_INIT(e_fk,-2292);
  7. BEGIN
  8. DELETE FROM dept WHERE deptno = &amp;deptno;
  9. EXCEPTION
  10. WHEN e_fk THEN
  11. -- 3、捕捉并处理异常
  12. dbms_output.put_line('此部门下有员工,不能删除!');
  13. WHEN OTHERS THEN
  14. dbms_output.put_line(sqlCODE || '###' || sqlERRM);
  15. END;
  • 当按下F8执行,键入20后,控制台打印如下内容
  1. 此部门下有员工,不能删除

4、自定义异常

  • 如果你想在某个特定事件发生时向应用程序的用户发出一些警告信息。而事件本身不会抛出Oracle内部异常,这个异常是属于应用程序的特定异常。那么就需要自定义异常。
  • 用户定义的异常错误时通过显式使用RAISE语句来触发的。当引发一个异常错误时,控制就转向到EXCEPTION块异常错误部分,执行错误处理代码

a、自定义异常的处理步骤

  • 对于这类异常情况的处理,步骤如下: 1、在PL/sql块的声明部分定义异常情况:<异常情况> EXCEPTION; 2、RAISE <异常情况> 3、在PL/sql块的异常处理部分对异常情况做出相应的处理。

b、示例代码

  • 更新指定员工编号的员工工资:
  1. DECLARE
  2. v_empno emp.empno%TYPE := &amp;empno;
  3. e_no_result EXCEPTION;
  4. BEGIN
  5. UPDATE emp SET sal = sal + 100 WHERE empno = v_empno;
  6. IF sql%NOTFOUND THEN
  7. RAISE e_no_result;
  8. ELSE
  9. COMMIT;
  10. END IF;
  11. EXCEPTION
  12. WHEN e_no_result THEN
  13. dbms_output.put_line('数据更新失败!');
  14. WHEN OTHERS THEN
  15. dbms_output.put_line('其他错误');
  16. END;

5、sqlCODE和sqlERRM

a、异常处理函数

b、异常处理函数示例代码

  • 插入员工信息(包括员工号、员工名和员工所属部门号):
  1. DECLARE
  2. v_empno emp.empno%TYPE := &amp;empno;
  3. v_ename emp.ename%TYPE := '&amp;ename';
  4. v_deptno emp.deptno%TYPE := &amp;deptno;
  5. BEGIN
  6. INSERT INTO emp(empno,ename,deptno) VALUES(v_empno,v_ename,v_deptno);
  7. IF sql%FOUND THEN
  8. DBMS_OUTPUT.put_line('数据插入成功');
  9. COMMIT;
  10. END IF;
  11. EXCEPTION
  12. WHEN OTHERS THEN
  13. DBMS_OUTPUT.put_line('错误号:' || sqlCODE);
  14. DBMS_OUTPUT.put_line('错误信息:' || sqlERRM);
  15. END;

c、RAISE_APPLICATION_ERROR

  1. raise_application_error(error_number,message);
  • error_number:用于定义错误号(-20000~-20999)。
  • message:用于指定错误信息,长度不能超过2048个字节。

猜你在找的Oracle相关文章