1、 异常处理:
|-- 异常处理用when then …
|---自己抛出异常 raise_application_error和raise
|-- 一个异常当前没处理,可以传递到外包围。
|-- 未处理异常:用户没有处理的异常。
|-- 整数异常,exception_int (name,integer);这里主要是获取系统定义的异常。
完成的异常过程:
Declare
Exception_name exception --定义一个异常;
Begin
Do-something
if 条件 then
raise Exception_name –抛出前面定义的异常
end if;
exception
when Exception_name then –扑捉前面的异常
do-something
when others then --获取其他异常。
do-something
end;
2、 内置的错误函数
|-- sqlcode: =0 表示正常。 !=0 有各自的意思
如:=-6502 (value_error)
|-- sqlerrm 输出上面对应的值: SQL error message 的缩写。最多可以返回512个字节。
如: dbms_output.put_line(sqlerrm(-6502)) --输出value_error
|--DBMS_utility.format_error_stack 与sqlerrm相似。可以输出1899个字符。
|--Dbms_utility.format_error_stackac :可以退回到最初错误出现的地方。
下面是调用子procedure 的过程,,已经执行 Dbms_utility.format_error_stackac 的结果。
create or replace procedure proc1 is
begin
dbms_output.put_line('running proc1');
raise no_data_found; --异常抛出:
end;
create or replace procedure proc2 is
l_str varchar2(20):='calling proc1';
begin
dbms_output.put_line(l_str);
proc1; --调用过程1
end;
create or replace procedure proc3 is
l_str varchar2(20):='calling proc2';
begin
dbms_output.put_line(l_str);
proc2; --调用异常2
exception
when others --处理全部的异常。
then
dbms_output.put_line('error stack at topleverl');
dbms_output.put_line(DBMS_utility.format_error_backtrace); ---追踪异常,回到最开始的异常。
end;
begin
dbms_output.put_line('3-2-1');
proc3; --调用前面的异常。
end;
输出结果:
3-2-1
calling proc2
calling proc1
running proc1
error stack at top leverl
ORA-06512: at "FENGGANG.PROC1", line 4
ORA-06512: at "FENGGANG.PROC2", line 6
ORA-06512:at "FENGGANG.PROC3", line 6
执行过程如下: