您好,欢迎访问一九零五行业门户网

标准Oracle PL/SQL 异常处理

环境:orcle 10g单独出现一个sql,异常如何处理,这里不说。一)标准的含异常处理的pl/sql块declare no_detail_record excep
环境:orcle 10g
单独出现一个sql,异常如何处理,这里不说。
一)标准的含异常处理的pl/sql块
declare
     no_detail_record exception;
     pragma exception_init(no_detail_record, -20000);
   v_ndetailcount number;        
begin
select count(*) into v_ndetailcount from tson where .....;   
    if v_ndetailcount=0 then
       raise_application_error(-20000,'');
   end if;
exception
    when no_detail_record then
        dbms_output.put_line('没有明细记录');
    when others then
       dbms_output.put_line('未知的异常');
end;
二)raise_application_error
抛出异常的函数名称及其格式
raise_application_error(error_number,message[, {true |false}])
其中raise_application_error中第一个参数,异常编号,自己定义的只能在[-20999,-20000]之间。
但是根据我自己的试验,如果定义的编号小于-20999,程序也能正常执行。
第三个参数的值默认是false,那么抛出的异常替换所有其它的异常,这就意味着其它异常你无法处理,而以当前异常取而代之(这是大部分情况下的自定义异常的选择);如果是true,那么新抛出的异常会存放在异常堆栈最上面(已经出现的其它异常之上)。
三)oracle预定义的pl/sql 异常
异常名称oracodesqlcode触发时机
login_denied01017-1017
非法用户名称或者密码登录时候
no_data_found01403100select into没有返回行;或者代码指向嵌套表中被删除的元素;或者代码指向索引表(数组)的未初始化的元素。
not_logged_on01012没有登录,确意图执行一些调用
program_error06501pl/sql存在内部的错误
rowtype_mismatch06504发生在一个游标给另外一个游标赋值的情况下,尤其是调用含有游标参数的子过程时候。如果二者返回类型不一致,会出现。
self_is_null30625试图调用一个没有初始化的对象的方法成员,因为关键字self表示的是对象的自生(是内建参数),在调用时候总是第一个传递给方法成员。
storage_error06500pl/sql耗尽了内存,或者内存发生泄露。
subscript_beyond_count06533简单而言,就是访问数组对象(或者嵌套表)时候,越界了。
subscript_outside_limit06532和上面一个类似,不通的是这里的索引号是非法的,例如-1
sys_invalid_rowid01410把一个不符合rowid格式的字符串转换为rowid时候发生的异常。
timeout_on_resource00051等待一个资源的时候,发生超时。
too_many_rows01422select into语句返回多余一行结果
value_error06502数字,转换,截取,或者大小约束发生的错误。例如用一个变量的长度比列的长度小,如果要保存列值就会发生异常。
在过程语句中,如果字符串转换为数字失败,会触发这个。在sql语句中,则是触发invalid_number异常。
zero_divide01476试图除以0.
access_into_null06530试图访问一个没有初始化对象的属性,和self_is_null类似
case_not_found06592“情况没有发现”
在一个case when子句中,没有一个选择是满足的,但是又不存在else子句。
collection_is_null06531试图实用exists之外的集合方法访问未初始化的数组或者嵌套表,或者是试图给它们赋值。
cursor_already_open06511试图重新打开已经打开的游标。
dup_val_on_index00001试图在唯一索引列上存入重复的值。
invalid_cursor01001试图对游标做一些非法的操作,例如试图关闭一个本来就没有打开的游标。
invalid_number01722和value_error类似,不过只适合sql语句,且是字符转数字时候发生的。
说明: 1)sqlcode,,通常情况下=-1* to_number(oracode),除非有特别说明。
            2)有几组异常是类似或者相关性比较大的,例如:
                  invalid_number     和 value_error
                  self_is_null          和 access_into_null, collection_is_null
           3) 和嵌套表以及数组的异常不少
           4) no_data_found是一个比较不通 的异常。其sqlcode=100,而不是-1403
其它类似信息

推荐信息