一:预定义异常错误
先看代码:
declare mytitle labor.xland.title%type; begin select title into mytitle from labor.xland where state = 2; dbms_output.put_line(mytitle); exception when no_data_found then dbms_output.put_line('没有找到数据'); end;
这段程序当检索到数据的时候就输出数据
检索不到数据即输出 没有找到数据
no_data_found 是一个预定义异常错误类型
更多预定义异常错误,请看:
http://www.cnblogs.com/liulun/articles/1526177.html
二:非预定义异常错误
先看代码:
declare v_sqlcode number; v_sqlerrm varchar2(2048); begin insert into labor.xland values(null,'1111',1); exception when no_data_found then dbms_output.put_line('没有找到数据'); when others then if sqlcode = -1400 then v_sqlcode := sqlcode; v_sqlerrm := sqlerrm; dbms_output.put_line(to_char(v_sqlcode)); dbms_output.put_line(v_sqlerrm); end if; end;
when 块不必跟end结束
if块需跟end if结束
sqlcode为错误码
sqlerrm为oracle反馈的错误信息
此程序输出:
-1400 ORA-01400: 无法将 NULL 插入 ("LABOR"."XLAND"."TITLE")
另外还有pragma exception_init(name,errcode)函数来处理非预定义异常
如:
declare v_exception exception; pragma exception_init(v_exception,-1400); begin insert into labor.xland values(null,'1111',1); exception when no_data_found then dbms_output.put_line('没有找到数据'); when v_exception then dbms_output.put_line('没有找到数据1'); end;
这里提到了一个新的数据类型 exception
pragma exception_init(name,errcode)
把错误号为-1400的错误赋值给v_exception
在第二个when子句中不能使用sqlcode等系统变量
三:自定义异常并抛出
先看代码
declare v_exception EXCEPTION; begin RAISE v_exception; exception when v_exception then dbms_output.put_line('捕获异常'); end;
先定义一个异常
然后抛出这个异常
然后捕获这个异常
如此而已