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);