转自:https://www.cnblogs.com/littlewu/p/8623956.html
预定义异常:

为了 Oracle 开发和维护的方便,在 Oracle 异常中,为常见的异常码定义了对应的异常名称,称为预定义异常,常见的预定义异常有:

异常名称 异常码 描述
DUP_VAL_ON_INDEX ORA-00001 试图向唯一索引列插入重复值
INVALID_CURSOR ORA-01001 试图进行非法游标操作
INVALID_NUMBER ORA-01722 试图将字符串转换为数字
NO_DATA_FOUND ORA-01403 SELECT INTO 语句中没有返回任何记录
TOO_MANY_ROWS ORA-01422 SELECT INTO 语句中返回多于 1 条记录
ZERO_DIVIDE ORA-01476 试图用 0 作为除数
CURSOR_ALREADY_OPEN ORA-06511 试图打开一个已经打开的游标

更多的异常参见https://www.techonthenet.com/oracle/exceptions/named_system.php

PL/SQL 中用 EXCEPTION 关键字开始异常处理。

BEGIN
--可执行部分
EXCEPTION -- 异常处理开始
WHEN 异常名 1 THEN
--对应异常处理
WHEN 异常名 2 THEN
--对应异常处理
……
WHEN OTHERS THEN
--其他异常处理
END;

语法解析:
异常发生时,进入异常处理部分,具体的异常与若干个 WHEN 子句中指明的异常名匹配,匹配成功就进入对应的异常处理部分,如果对应不成功,则进入 OTHERS 进行处理。
案例:

SQL> DECLARE
2 newSal emp.sal % TYPE;
3 BEGIN
4 SELECT sal INTO newSal FROM emp;
5 EXCEPTION
6 WHEN TOO_MANY_ROWS THEN
7 dbms_output.put_line('返回的记录太多了');
8 WHEN OTHERS THEN
9 dbms_output.put_line('未知异常');
10 END;

运行上面代码,返回

返回的记录太多了
PL/SQL 过程已成功完成。

自定义异常:

除了预定义异常外,用户还可以在开发中自定义异常,自定义异常可以让用户采用与PL/SQL 引擎处理错误相同的方式进行处理,用户自定义异常的两个关键点:
1. 异常定义:在 PL/SQL 块的声明部分采用 EXCEPTION 关键字声明异常,定义方法与定义变量相同。比如声明一个 myexception 异常方法是:
myexception EXCEPTION;
2. 异常引发:在程序可执行区域,使用 RAISE 关键字进行引发。比如引发 myexception方法是:
RAISE myexception;
案例:

代码演示:自定义异常

SQL> DECLARE
2 sal emp.sal%TYPE;
3 myexp EXCEPTION;                                        --01
4 BEGIN
5 SELECT sal INTO sal FROM emp WHERE ename='JAMES';
6 IF sal<5000 THEN
7 RAISE myexp;                                            --02
8 END IF;
9 EXCEPTION
10 WHEN NO_DATA_FOUND THEN
11 dbms_output.put_line('NO RECORDSET FIND!');
12 WHEN MYEXP THEN                                        --03
13 dbms_output.put_line('SAL IS TO LESS!');
14 END;

运行上面代码,返回:

SAL IS TO LESS!PL/SQL 过程已成功完成。

代码解析:
01: 用 EXCEPTION 定义一个异常变量 myexp
02: 在一定条件下用 RAISE 引发异常 myexp
03: 在异常处理部分,捕获异常,如果不处理异常,该异常就抛给程序执行者。

引发应用程序异常

在 Oracle 开发中,遇到的系统异常都有对应的异常码,在应用系统开发中,用户自定义的异常也可以指定一个异常码和异常信息, Oracle 系统为用户预留了自定义异常码,其范围介于-20000 到-20999 之间的负整数。引发应用程序异常的语法是:

RAISE_APPLICATION_ERROR(异常码,异常信息)

案例:

代码演示:引发应用系统异常

SQL> DECLARE
2 sal emp.sal%TYPE;
3 myexp EXCEPTION;
4 BEGIN
5 SELECT sal INTO sal FROM emp WHERE ename='JAMES';
6 IF sal<5000 THEN
7 RAISE myexp;
8 END IF;
9 EXCEPTION
10 WHEN NO_DATA_FOUND THEN
11 dbms_output.put_line('NO RECORDSET FIND!');
12 WHEN MYEXP THEN
13 RAISE_APPLICATION_ERROR(-20001,'SAL IS TO LESS!');      --01
14 END;

执行上面代码,输出如下:

ORA-20001: SAL IS TO LESS!
ORA-06512: 在 line 13

代码解析:
01: 引发应用系统异常,指明异常码和异常信息。

如果要处理未命名的内部异常,必须使用 OTHERS 异常处理器。也可以利用 PRAGMA EXCEPTION_INIT 把一个异常码与异常名绑定。PRAGMA 由编译器控制, PRAGMA 在编译时处理,而不是在运行时处理。 EXCEPTION_INIT告诉编译器将异常名与 ORACLE错误码绑定起来,这样可以通过异常名引用任意的内部异常,并且可以通过异常名为异常编写适当的异常处理器。 PRAGMA EXCEPTION_INIT 的语法是:

PRAGMA EXCEPTION_INIT(异常名,异常码)

这里的异常码可以是用户自定义的异常码,也可以是 Oracle 系统的异常码。

案例:

代码演示:PRAGMA EXCEPTION_INIT 异常

--outterseg
DECLARE
null_salary EXCEPTION;
PRAGMA EXCEPTION_INIT(null_salary, -20101);   --01
BEGIN
--innerStart 02
DECLARE
curr_comm NUMBER;
BEGIN
SELECT comm INTO curr_comm FROM emp WHERE empno = &empno;
IF curr_comm IS NULL THEN
RAISE_APPLICATION_ERROR(-20101, 'Salary is missing'); --03
ELSE
dbms_output.put_line('有津贴');
END IF;
END;
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('没有发现行');
WHEN null_salary THEN
dbms_output.put_line('津贴未知');  --04
WHEN OTHERS THEN
dbms_output.put_line('未知异常');
END;

代码解析:
01: 把异常名称 null_salary 与异常码-20101 关联,该语句由于是预编译语句,必须放在声明部分。也就是说-20101 的异常名称就是 null_salary。
02: 嵌套 PL/SQL 语句块
03: 在内部 PL/SQL 语句块中引发应用系统异常-20101。
04: 在外部的 PL/SQL 语句块中就可以用异常名 null_salary 进行捕获。

存储过程中的异常处理相关推荐

  1. mysql游标遍历中sql语句出现异常_MySQL中的异常处理,游标

    一.异常处理的理解 ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY' 错误 4位error code(5位sql statis):错误 ...

  2. mysql 存储过程 错误码_mysql存储过程中的错误处理_mysql

    mysql存储过程中的异常处理 http://www.cnblogs.com/cookiehu/p/4994278.html 定义异常捕获类型及处理方法: DECLAREhandler_action ...

  3. oracle存储过程捕捉异常后回滚_Oracle存储过程中异常处理应注意的问题

    如果主存储过程和主函数又由子过程或子函数构成,在子函数或子程序中能否包含异常处理 要依据以下原则: 第一.如果主程序和子程序要作为一个事务来处理,则在子程序中不能触发异常,异常要到主调程序中取处理,如 ...

  4. SQL Server在存储过程中编写事务处理代码的三种方法

    SQL Server中数据库事务处理是相当有用的,鉴于很多SQL初学者编写的事务处理代码存往往存在漏洞,本文我们介绍了三种不同的方法,举例说明了如何在存储过程事务处理中编写正确的代码.希望能够对您有所 ...

  5. db2 删除存储过程_数据库教程-SQL Server存储过程使用及异常处理

    SQL Server存储过程 存储过程(Procedure)是数据库重要对象之一,也是数据库学习的重点之一.本文,我们以SQL Server为例对存储过程的概念.定义.调用.删除及存储过程调用异常等通 ...

  6. 在存储过程中如何实现将ID列表字符串传入IN()

    我们在平常编写sql语句时,经常碰到要把id列表字符串(比如:'001,002,003,....')当做参数传递给存储过程, 那么在存储过程中要用in作为条件进行记录的过滤,那么采用in(@idLis ...

  7. 存储过程中返回结果集

    存储过程中返回结果 从存储过程中返回结果有三种方式: 1. 返回结果集 这是客户端应用程序返回结果的最通用的方法.结果集是通过使用select语句选择数据产生的.结果集可以从永久表.临时表或局部变量中 ...

  8. mysql中leave和_MySQL数据库之Mysql存储过程使用LEAVE实现MSSQL存储过程中return语法

    本文主要向大家介绍了MySQL数据库之Mysql存储过程使用LEAVE实现MSSQL存储过程中return语法 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. DELIMITER ...

  9. kotlin中的异常处理_如何使用assertFailsWith在Kotlin中测试异常

    kotlin中的异常处理 by Daniel Newton 丹尼尔·牛顿 如何使用assertFailsWith在Kotlin中测试异常 (How to test exceptions in Kotl ...

最新文章

  1. openssl/ssl.h file not found mac 完美解决
  2. 中年架构师的20个小时,全靠忍!
  3. 哪个更值得入手?荣耀8与小米6对比评测
  4. STL源码剖析 关联式容器
  5. spring事务源码解析
  6. Maven: maven parent.relativepath point at wrong local pom
  7. HTML — 快速开发总结篇
  8. java 数据库编程(一)JDBC连接Sql Server数据库
  9. Java IO _打印流
  10. Visio 2019图文安装教程
  11. android 照片加水印,Android实现为图片添加水印
  12. 两向量叉乘的计算公式_向量的叉乘运算法则
  13. win7耳机插前面没声音_win7电脑音箱没声音如何解决 win7电脑音箱没声音解决方式【图解】...
  14. 操作系统对计算机组件的抽象概念表示
  15. HUD - 1873
  16. 程序包xxx不存在 问题的完美解决
  17. 关于nacos配置中心配置不成功的问题
  18. 学校校园学生寝室管理查寝打分系统 毕业设计毕设源码毕业论文开题报告参考(4)网站和学生功能
  19. Echarts水波图实现
  20. ce能修改服务器数据吗,ce修改游戏服务器数据库

热门文章

  1. vue和微信小程序的基本使用区别
  2. 16位汇编语言第二讲系统调用原理,以及各个寄存器详解
  3. python写入excel文件追加写入_Python读写/追加excel文件Demo
  4. 基于DE2的开源片上系统Freedom E310移植
  5. 用示波器抓取LIN协议波形并分析
  6. 调教ChatGpt看这一篇文章就够了
  7. 本地化部署大语言模型 ChatGLM
  8. 【Linux集群教程】09 集群监控 - 监控简介和Cacti搭建
  9. SQL查询中的模糊匹配
  10. 如何写长尾关键词的文章