PLSQL中的异常处理

本文主要介绍PLSQL中的异常处理。PLSQL异常分Oracle内部错误抛出和程序员显式抛出两种,前者又有预定义和非预定义之分。文中列举了常见预定义例外,还介绍了抛出、处理异常的方法,以及获取错误号和描述的内置函数,最后阐述了自定义异常的两种方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PLSQL中的异常一般有两种:

1、Oracle 内部错误抛出的异常:这又分为预定义异常(有错误号+常量定义) 和 非预定义例外 (仅有错误号,无常量定义)

2、程序员显式的抛出的异常

处理预定义的例外:有些常见例外,Oracle 都已经预定义好了,使用时无需预先声明,比如:

–NO_DATA_FOUND (没找到数据)

–TOO_MANY_ROWS (列数超过范围)

–INVALID_CURSOR

–ZERO_DIVIDE (被除数不能为0)

–DUP_VAL_ON_INDEX

-VALUE_ERROR (数据赋值错误)

抛出异常:

declare

v_data number;

v_myexp exception; --定义一个异常变量

begin

v_data :=&inputData; --输入数据

if v_data>10 and v_data<100 then

raise v_myexp;

处理异常:

使用exception处理异常:

例如处理被除数为0的异常:

declare

v_result number;

begin

v_result:=10/0;

dbms_output.put_line('异常之后的代码将不再执行!');

exception

when zero_divide then

dbms_output.put_line('被除数不能为0!');

when others then

dbms_output.put_line('其他未知异常');

ROLLBACK;

v_error_code := SQLCODE ;

v_error_message := SQLERRM ;

end;

发生这种情况时,我们还是希望了解当时发生的Oracle错误号和相关描述信息,Oracle 提供了两个内置函数 SQLCODE 和 SQLERRM 分别用来返回Oracle 错误号和错误描述

注意:1.异常之后的代码将不再执行

2.异常可以嵌套

3.异常未处理会往外一层抛出

OTHERS的处理: Others表明我们程序员未能预计到这种错误,所以全部归入到others 里面去了

 

自定义异常:

 

方式一:在声明块中声明exception对象,此方式有两种选择:

1.声明异常对象并用名称来引用它,此方式使用普通的others异常捕获用户定义异常;

2.声明异常对象并将它与有效的Oracle错误代码映射,需要编写单独的when语句块捕获;

例如:

declare

v_data number;

v_myexp exception; --定义一个异常变量

begin

v_data :=&inputData; --输入数据

if v_data>10 and v_data<100 then

raise v_myexp;

end if;

exception

when v_myexp then

dbms_output.put_line('输入数据有错误1');

dbms_output.put_line('sqlcode='||sqlcode);

dbms_output.put_line('sqlerrm='||sqlerrm);

end;

方式二:在执行快中构建动态异常。通过“raise_application_error”函数构建动态异常。在触发动态异常时,可使用-2000到-2999范围的数字。如果使用动态异常,可以在运行时指派错误消息。

declare

v_data number;

v_myexp exception; --定义一个异常变量

begin

v_data :=&inputData; --输入数据

if v_data>10 and v_data<100 then

raise_application_error(-20789,'输入数字不能在10-100之间!');

end if;

exception

when v_myexp then

dbms_output.put_line('输入数据有错误1');

dbms_output.put_line('sqlcode='||sqlcode);

dbms_output.put_line('sqlerrm='||sqlerrm);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值