一、异常简介

·为了提高程序的健壮性,必须考虑异常情况,否则程序会被终止

·异常(Exception)是一种PL/SQL标识符

·通过在PL/SQL块中引入异常处理部分,可以捕获各种例外,并根据例外的情况进行相应的处理

二、异常分类

1.oracle提供的预定义异常

①预定义的异常是PL/SQL所提供的系统异常

②当PL/SQL应用程序违反oracle规则或系统限制时,会触发一个内部异常

③PL/SQL提供20多种预定义的异常

④常见的预定义异常:

ACCESS_INTO_NULL:对象未初始化异常

CASE_NOT_FOUND:WHEN子句中没有包含CASE的情况

COLLECTION_IS_NULL:集合未初始化异常

CURSOR_ALREADY_OPEN:重新打开游标时的异常

DUP_VAL_ON_INDEX:当在唯一索引对应的列上键入重复值时的异常

INVALID_CURSOR:在不合法的游标上执行操作的异常

INVALID_NUMBER:不能有效地将字符转变成数字的异常

NO_DATA_FOUND:没有数据返回的异常

TOO_DATA_ROWS:返回超多一行数据时的异常

ZERO_DIVIDE:使用数字值除0时的异常

SUBSCRIPT_OUTSIDE_LIMIT:元素下标为负的异常

SUBSCRIPT_BEYOND_COUNT:元素下标越界的异常

VALUE_ERROR:变量长度不足以容纳实际数据时的异常

LOGIN_DENIED:用户名和口令错误时的异常

NOT_LOGGED_ON:没有连接数据库时的异常

PROGRAM_ERROR:PL/SQL的内部问题,需要重新安装数据字典和PL/SQL系统包

ROWTYPE_MISMATCH:宿主游标变量和PL/SQL游标变量的返回类型不兼容时的异常

STORAGE_ERROR:超出内存空间和内存损坏时的异常

SYS_INVALID_ROWID:将字符串转化为ROWID时的异常

TIMEOUT_ON_RESOURCE:等待资源超时的异常

OTHERS:代表所有没有在前面被捕获的异常返回行数超过一行

实例:

①TOO_MANY_ROWS  在隐式游标处理时,select返回行数超过一行

SQL> DECLARE

2    v_ename emp.ename%TYPE;

3    v_sal emp.sal%TYPE;

4  BEGIN

5    SELECT ename,sal INTO v_ename,v_sal FROM emp WHERE deptno=&n;

6    dbms_output.put_line(v_ename||':'||v_sal);

7  EXCEPTION

8    WHEN too_many_rows THEN

9      dbms_output.put_line('You return rows more than one!');

10    WHEN OTHERS THEN

11      dbms_output.put_line('Other''s error!');

12  END;

13  /

You return rows more than one!

PL/SQL procedure successfully completed

②NO_DATA_FOUND 在访问数据时,没有发现数据

SQL> DECLARE

2    v_ename emp.ename%TYPE;

3    v_sal emp.sal%TYPE;

4  BEGIN

5    SELECT ename,sal INTO v_ename,v_sal FROM emp WHERE empno=#

6    dbms_output.put_line(v_ename||':'||v_sal);

7  EXCEPTION

8    WHEN no_data_found THEN

9       dbms_output.put_line('No data found,Please input correct number!');

10    WHEN OTHERS THEN

11      dbms_output.put_line('Others''s error!');

12  END;

13  /

No data found,Please input correct number!

PL/SQL procedure successfully completed

③ZERO_DIVIDE 除数为零

SQL> DECLARE

2    v_num1 NUMBER :=10;

3    v_num2 NUMBER;

4    v_num3 NUMBER;

5  BEGIN

6    v_num2:=&nn;

7    v_num3:=v_num1/v_num2;

8    dbms_output.put_line('Number is:'||v_num3);

9  EXCEPTION

10    WHEN zero_divide THEN

11      dbms_output.put_line('Divisor is equal to zero,Please input correct Number!');

12    WHEN OTHERS THEN

13      dbms_output.put_line('Other''s error!');

14   end;

15  /

Divisor is equal to zero,Please input correct Number!

PL/SQL procedure successfully completed

2.自定义异常

①自定义异常的步骤

·定义异常名称: 类型exception

·举出异常(raise exception)

·捕获异常

实例:

SQL> DECLARE

2    e_user_err  EXCEPTION;

3    v_deptno  dept.deptno%TYPE :=&NO;

4  BEGIN

5    UPDATE dept SET loc='HongKong' WHERE deptno=v_deptno;

6    IF SQL%NOTFOUND THEN

7      RAISE e_user_err;

8    END IF;

9    COMMIT;

10  EXCEPTION

11    WHEN e_user_err THEN

12      dbms_output.put_line('This department'||v_deptno||' is not in dept table,Please input corrent number!');

13    END;

14  /

This department99 is not in dept table,Please input corrent number!

PL/SQL procedure successfully completed

3.非预定义异常

①通过oracle ora-xxxx错误代码,建立异常捕获

SQL> DECLARE

2    e_emp_remain EXCEPTION;

3    PRAGMA EXCEPTION_INIT(e_emp_remain,-2292);

4    v_deptno dept.deptno%TYPE :=&NO;

5  BEGIN

6    DELETE FROM dept WHERE deptno=v_deptno;

7    COMMIT;

8  EXCEPTION

9    WHEN e_emp_remain THEN

10      dbms_output.put_line('Don''t remove this'||v_deptno||' department!'||',This record is in emp!');

11   WHEN OTHERS THEN

12     dbms_output.put_line('Others error!');

13   END;

14  /

PL/SQL procedure successfully completed

SQL> /

Don't remove this10 department!,This record is in emp!

PL/SQL procedure successfully completed

②获取others中错误代码和错误信息

Sqlcode:oracle 错误代码

Sqlerrm:oracle 错误信息

SQL> CREATE TABLE ERRORS(CODE NUMBER,msg VARCHAR2(255));

SQL> DECLARE

2    v_code errors.code%TYPE;

3    v_msg errors.msg%TYPE;

4    v_sal  emp.sal%TYPE;

5  BEGIN

6    SELECT sal INTO v_sal FROM emp WHERE deptno=&NO;

7  EXCEPTION

8    WHEN no_data_found THEN

9      dbms_output.put_line('No this department ID');

10      WHEN OTHERS THEN

11        dbms_output.put_line('Others error');

12        v_code :=SQLCODE;

13        v_msg :=SQLERRM;

14        dbms_output.put_line(v_msg);

15      INSERT INTO ERRORS VALUES(v_code,v_msg);

16      INSERT INTO ERRORS VALUES(v_code,v_msg);

17      COMMIT;

18   END;

19  /

Others error

ORA-01422: 实际返回的行数超出请求的行数

PL/SQL procedure successfully completed

SQL> select * from errors;

CODE MSG

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

-1422 ORA-01422: 实际返回的行数超出请求的行数

-1422 ORA-01422: 实际返回的行数超出请求的行数

-1422 ORA-01422: 实际返回的行数超出请求的行数

-1422 ORA-01422: 实际返回的行数超出请求的行数

【PL/SQL】异常处理相关推荐

  1. PL/SQL异常处理(原创)

    Exception概述 Exception是一种PL/SQL标识符,当运行的PL/SQL块出现错误或警告,则会触发异常处理.为了提高程序的健壮性,可以在PL/SQL块中引入异常处理部分,进行捕捉异常, ...

  2. Oracle入门(十四B)之PL/SQL异常处理

    定义:程序执行过程的警告或错误成为例外(Exception) 一.常见预定义错误 二.非预定义错误及用户定义错误 (1)非预定义oracle错误 其他标准的oracle错误,可以自定义异常名,将其与指 ...

  3. PL/SQL异常处理

    As we all known,程序的错误一般分为两类:编译错误和运行时错误.其中运行时错误被称为异常.PL/SQL语句块中处理异常的部分即为异常处理部分.在异常处理部分,可以指定当特定异常发生时所采 ...

  4. Oracle笔记 七、PL/SQL 异常处理

    --异常处理 declare sNum number := 0; begin sNum := 5 / sNum; dbms_output.put_line(sNum); exception when ...

  5. PL/SQL -- INSTEAD OF 触发器

    为什么80%的码农都做不了架构师?>>>    --============================== -- PL/SQL --> INSTEAD OF 触发器 -- ...

  6. pl/sql块的基本语法

    创建一个触发器: create or replace trigger trigafter insert--触发器时间on emp--在哪一个表上创建的触发器,触发对象for each row--说明创 ...

  7. PL/SQL -- 动态SQL

    --==================== -- PL/SQL --> 动态SQL --==================== 使用动态SQL是在编写PL/SQL过程时经常使用的方法之一.很 ...

  8. PL/SQL -- 函数

    --================== -- PL/SQL --> 函数 --================== 函数通常用于返回特定的数据.其实质是一个有名字的PL/SQL块,作为一个sc ...

  9. Oracle入门(十四)之PL/SQL

    一.PL/SQL 基本语法 PL/SQL语言是模块式的过程化SQL,是oracle公司对SQL的扩展. (1) (2) (3) (5) (6) (7)数据类型 Number 数字型 Varchar2 ...

  10. PL/SQL -- DML 触发器

    --======================= -- PL/SQL --> DML 触发器 --======================= 何谓触发器?简言之,是一段命名的PL/SQL代 ...

最新文章

  1. CVPR2021 | PAConv:一种位置自适应卷积,点云分类、分割任务表现SOTA
  2. 估值380亿美元!这家微软、谷歌、亚马逊都投资的AI初创公司什么来头?
  3. 智能+制造,聪明的公司都走上了智能制造的道路
  4. 从测试角度对测试驱动开发的思考【转】
  5. 力扣-二叉树的前序遍历
  6. linux新增动态库后可执行程序找不到的问题
  7. Deformable ConvNets自己的理解
  8. caj安装,win10,错误1372。无效驱动器:D:\ (解决方案大全总结)
  9. 2020-12-25
  10. 怎样找到win7系统默认的微信缓存文件夹路径
  11. 若干个数据首尾相连,构成一个圆环,找到连续的4个数之和最大的一段。 C++
  12. STM32对于1997与2007电表数据规约的解析
  13. JS判断字符串是否含有某个值
  14. SimpleDateFormat的概述
  15. ui设计培训机构内课程包括哪些板块|优漫动游
  16. 详解分布式 ID 生成器
  17. vue 报错:Elements in iteration expect to have ‘v-bind:key‘ directives
  18. Linux和Windows误删文件恢复办法
  19. dede列表命名规则
  20. HP pavilion g4笔记本详细拆机图解

热门文章

  1. Android仿人人客户端(v5.7.1)——Auth授权认证(整理流程,重构代码)
  2. 阿里巴巴正式上线全球首个数据中心Open Channel SSD产品
  3. ssh网络服务的搭建和配置
  4. 使用画图软件gunplot出现的问题和解决办法
  5. iTerm2 快捷键收集
  6. java static 变量,和方法从属于类
  7. 01-C#入门(分支控制语句)
  8. C#十进制与十六进制转换
  9. linux学习笔记整理
  10. juniper防火墙策略元素