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

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

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • BCG界面库_bcg模式什么意思

    BCG界面库_bcg模式什么意思本文以MDI应用程序为例说明如何在已有的VC++工程中使用BCG界面库,我的开发环境为VS2003。1,将BCG/BCGCBPro目录路径添加到“项目属性->C/C++->常规->附加包含目录”中,同时将BCG/Bin目录路径添加到“项目属性->链接器->常规->附加库目录”中。2,确保在CWinApp派生类(设为CMyApp)的InitInstance()成员函数中调用A

    2022年10月8日
  • 2017过去了,2018来了「建议收藏」

    2017那些过往的岁月,留给自己!

    2022年2月26日
  • 2014年度总结

    2014年度总结2015都过了近1个月了,早该好好总结一下了。   2014年,对我来说,意味着忙乱、匆促、迷惑、徘徊,还有最准确的表达:抉择!   还是老规矩,分别从生活、工作、学习三个维度来回顾。  【生活篇】   (1)陪伴妻儿     看着儿子一天天长大,仿佛每一天都有新的变化:从可以走路,到能说完整的句子,每一个关键事件,都让我和老婆欣喜不已!当

    2022年7月12日
  • linux iostat 命令详解

    linux iostat 命令详解iostat主要用于监控系统设备的IO负载情况,iostat提供了丰富的参数给我们查询各种维度的io数据,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。一、命令相关参数命令使用:iostat[-c][-d][-N][-n][-h][-k|-m][-t][-V][-x][-y][-z][-j{ID|L

    2022年10月6日
  • 如何创建一个Java项目[通俗易懂]

    如何创建一个Java项目[通俗易懂]文章目录新建项目项目信息配置创建Java类编译和运行新建项目首先双击eclipse进入到eclipse页面。菜单“File”下的“New”里“JavaProject”,点击即可创建Java项目。项目信息配置1)给项目起名称。2)usedefaultlocation(使用默认位置),当然,你也可以使用Browse更改默认位置3)确保勾选Useprojectfolderasrootforsourcesandclassfiles,从而.java文件(源文件)和.clas

    2022年7月8日
  • qt交叉编译环境搭建_arm linux gcc

    qt交叉编译环境搭建_arm linux gccaarch64-linux-gnu-gcc是由Linaro公司基于GCC推出的的ARM交叉编译工具

    2022年10月10日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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