Oracle 异常详解(exception)

Oracle 异常详解(exception)Oracle异常详解(exception)来源:(33条消息)Oracle异常详解(exception)_鱼丸丶粗面-CSDN博客鱼丸丶粗面2018-10-0823:03:232949

大家好,又见面了,我是你们的朋友全栈君。

Oracle 异常详解(exception)

来源:(33条消息) Oracle 异常详解(exception)_鱼丸丶粗面-CSDN博客

鱼丸丶粗面 2018-10-08 23:03:23 2949 收藏 14
分类专栏: Oracle PL/SQL 文章标签: Oracle 异常 exception raise
版权

Oracle
同时被 2 个专栏收录
110 篇文章10 订阅
订阅专栏

PL/SQL
17 篇文章1 订阅
订阅专栏
文章目录
1 概述
1.1 思维导图
1.2 语法
2 异常分类
2.1 系统预定义
2.2 用户自定义
3 异常抛出
3.1 raise
3.2 raise_application_error
4 重写异常
1 概述
1. 概念
(1) 程序一旦发生异常而没有处理时,程序会 ‘自动终止’
(2) 反之,则跳转至 ‘最近一个 exception’ 进行处理
1
2
3
1.1 思维导图

1.2 语法
1. 异常处理可以按任意次序排列,但 ‘others’ 必须放在最后
2. 异常会被离它 ‘最近的一个 exception 块’ 捕获到
(1) 若异常被 <异常1> 捕获到,那么该异常到此结束(不会继续判断 <异常2> 及其后面的)

如:
declare
begin
程序代码块;
exception
when <异常1> then
异常语句1;
when <异常2> then
异常语句2;
when others then
其它异常;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
例子:(除数不能为 0)

DECLARE
v_num NUMBER(5) := 5;
BEGIN
BEGIN
v_num := v_num / 0;
EXCEPTION
— 如果此处无 exception,则抛向最近一个 exception
WHEN OTHERS THEN
dbms_output.put_line(SQLCODE); — 异常编号
dbms_output.put_line(SQLERRM); — 异常描述信息
dbms_output.put_line(dbms_utility.format_error_backtrace); — 异常发生的位置
dbms_output.put_line(dbms_utility.format_call_stack); — 异常堆栈
END;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(‘若没有上面的 exception 代码块,异常才会被此处捕获’);
END;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2 异常分类
1. 异常的两种分类
(1) 系统预定义:Oracle 自动抛出(如:’违反唯一性约束’)
(2) 用户自定义:编码人员认为的 ‘非正常情况’

2. 其中 ‘用户自定义’ 的异常在 pl/sql 环境使用,需 ‘显示抛出’
1
2
3
4
5
基础数据准备:

create table stu_info(
sno number(3) constraint pk_stu_info_sno primary key,
sname varchar2(30)
);
1
2
3
4
2.1 系统预定义
insert into stu_info(sno, sname) values(1, ‘瑶瑶’);
insert into stu_info(sno, sname) values(1, ‘优优’);
1
2
报错截图:(ORA-00001: 违反唯一约束条件)

2.2 用户自定义

declare
v_num number(5) := -1;
exp_data_range exception; — 异常定义
begin
if v_num < 0 then
raise exp_data_range; — 异常抛出
end if;
exception
when exp_data_range then
dbms_output.put_line(‘数据范围不能为负数!’);
end;
1
2
3
4
5
6
7
8
9
10
11
测试结果:

数据范围不能为负数!
1
3 异常抛出
1. raise:异常抛出并在 pl/sql exception 块中处理

2. raise_application_error:异常抛出给 ‘应用程序’,pl/sql 中并不处理!
1
2
3
3.1 raise
上述提到的就有:2.2 用户自定义
3.2 raise_application_error
raise_application_error(error_number, error_message, error_boolean);
error_number : 取值范围: -20000 到 -20999 之间
error_message :相应的提示信息(< 2048 字节),超出则截取。
error_boolean : 可选项,若为 true: 则新错误将被添加到已经引发的错误列表中。
若为 false(默认):则覆盖。
1
2
3
4
5
例1:false(默认,覆盖异常信息,若有)

declare
v_num number(5) := -1;
begin
if v_num < 0 then
raise_application_error(-20001, ‘不能为负数!’); — 异常抛出
end if;
end;
1
2
3
4
5
6
7
异常抛出截图:

例2:true(追加异常信息)

declare
v_num number(5) := -1;
begin
begin
if v_num < 0 then
raise_application_error(-20001, ‘不能为负数!’); — 异常抛出
end if;
exception
when others then
raise_application_error(-20001, ‘true:追加异常信息’, true); — 异常抛出
end;
end;
1
2
3
4
5
6
7
8
9
10
11
12
异常抛出截图:

4 重写异常
1. 异常均可被重写
(1) 系统预定义
(2) 用户自定义
1
2
3
示例:重写系统预定义异常:ORA-01476: 除数为 0

declare
exp_divisor_of_zero_rewrite exception;
pragma exception_init(exp_divisor_of_zero_rewrite, -1476);
v_num number(1) := 3;
begin
v_num := v_num / 0;
exception
when exp_divisor_of_zero_rewrite then
raise_application_error(-20001, ‘除数不能为 0(重写异常)’);
end;
1
2
3
4
5
6
7
8
9
10
异常抛出截图:

————————————————
版权声明:本文为CSDN博主「鱼丸丶粗面」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34745941/article/details/82846820

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/155267.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Java private关键字及作用

    Java private关键字及作用private关键字使用场景:用private关键字将需要保护的成员变量进行修饰private关键字注意事项:一旦使用了private进行修饰,那么本类当中仍可以随意访问;但是超出本类范围就不可

  • java工程师青春饭吗_Java工程师是青春饭吗?

    java工程师青春饭吗_Java工程师是青春饭吗?首先来说说,为什么会有些开发人员会被裁掉呢?因为Java行业是竞争力比较大的行业,由于现在社会上的各种对Java行业的宣传,现在越来也多的年轻人学习Java技能并想找Java相关的工作,这就使得一些人如果找到工作后不好好工作浑水摸鱼就很容易被别的年轻人挤掉工作岗位。其次Java开发并不是一门熟能生巧的工作,Java开发技术日新月异,更新换代很快,所以并不是你掌握好几项Java技术并找到工作后就能安…

  • anaconda和pycharm安装哪个版本好_pycharm专业版激活成功教程安装教程

    anaconda和pycharm安装哪个版本好_pycharm专业版激活成功教程安装教程文章目录Pycharm中嵌入AnacondaAnaconda下载Pycharm下载Anaconda安装Pycharm安装将Anaconda配置到Pycharm中添加一个python文件到工程Pycharm中嵌入AnacondaAnaconda下载关于这两个软件的介绍,相信不用我多说,大家都知道,Pycharm是一款很好用的Python的IDE支持很多牛逼的骚操作,而Anaconda则是一款集…

  • Linux的vi命令用法大全_linux top命令详解

    Linux的vi命令用法大全_linux top命令详解vi共分为三种模式:分别是一般模式,编辑模式与命令行模式一般模式:以vi打开一个文件就直接了一般模式(这是默认的模式)编辑模式:在指令模式下输入的按键“i,I,o,O,a,A,r,R”,vi即认为是在当前位置插入字符。而在输入模式下,vi则把输入的按键当作插入的字符来处理。指令模式切换到输入模式只需键入相应的输入命令即可(如a,A),而要从输入模式切换到指令模式,则需在输入模式下键入…

  • Modelsim下载 安装 与 和谐教程

    Modelsim下载 安装 与 和谐教程一.下载ModelsimSE-642019.2-windows网盘分享:链接:https://pan.baidu.com/s/1BASOJ1DYZYrK9Ot_BRs7HA提取码:md4d二.安装下载完压缩包后解压,安装按下图所示步骤进行。注意,完全退出杀毒软件如360,否则可能安装/和谐失败。自此安装完成,下面进行和谐。三.和谐运行patch.dll会生成LICENSE.TXT文件,将此文件另存到modelsim安装路径下。建立用户环境变量:.

  • 易语言钓鱼源码_觅风现在还做易语言吗

    易语言钓鱼源码_觅风现在还做易语言吗水平有限请轻喷.这是一个易语言写的钓鱼程序,把自己伪装成一个QQ安全中心界面.其实我也没用过易语言,但在我看来(可能是我水平不高看不出来) 病毒内部循环繁杂无章,启动较慢… 简单差了一下程序没有加壳病毒很简单没加壳,这也是我第一次分析易语言. 没有什么特别的技巧,OD载入跟

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号