zoukankan      html  css  js  c++  java
  • 【Oracle】异常信息的加工处理

    引言

        很多时候,我们调用oracle存储过程都会发生各种各样的异常信息,例如ORA-12899值过大,ORA-01400不能插入空值等.虽然说这类异常是前端没控制到位的缘故,但是现实很难100%完全控制住,所以一旦发生了这类异常,并返回的前端显示时就会造成很差的用户体验了.或许,我们可以将这类异常加工一下,包装得好看些,让用户看得懂发生了什么事情,能够自行处理.下面是我的一点尝试.

        我们通常会在oracle存储过程的异常处理得到异常信息,如:

    Exception
        When Others Then
         rollback;
         dbms_output.put_line(sqlerrm);
         Raise_Application_Error(-20000,sqlerrm); 

         然而,我们将会得到下面的异常信息,如

    ORA-12899: 列 "NIS"."T_CZL_ACCOUNT"."VC_ACCOUNT" 的值太大 (实际值: 35, 最大值: 20)

         虽然说我们99%的程序员都看得懂这个是什么意思,但是也有99%的用户看不出个所以然.我们的目标是意外发生了,用户依然看得懂.接下来,我需要创建一个函数,专门处理这类的异常,返回大部分用户看得懂的信息.函数代码如下:

    create or replace function f_czl_geterror(message in varchar2)
    return varchar2 is
       Result varchar2(1000);
      
       num1 number:=0;
       num2 number:=0;
       num3 number:=0;
       num4 number:=0;
       num5 number:=0;
       num6 number:=0;
       num7 number:=0;
       num8 number:=0;
       num9 number:=0;
       num10 number:=0;
       str1 varchar2(1000);             
       str2 varchar2(1000);  
       str3 varchar2(1000);
       str4 varchar2(1000);
       str5 varchar2(1000);                                
       str6 varchar2(1000);             
       str7 varchar2(1000);  
       str8 varchar2(1000);
       str9 varchar2(1000);
       str10 varchar2(1000);
    begin
       
        if instr(message, 'ORA-12899')>0 then
         num1:=instr(message,'ORA-12899'); --得到 ORA-12899的所在位置
         str1:=substr(message,num1);    --得到ORA-12899后面的所有字符 
         num2:=instr(str1,'"',1,3);    --得到ORA-12899后面第三个"的位置
         num3:=instr(str1,'"',1,4);    --得到ORA-12899后面第四个"的位置
         str2:=substr(str1,num2+1,num3-num2-1);  --得到表名
         num4:=instr(str1,'"',1,5);    --得到ORA-12899后面第五个"的位置
         num5:=instr(str1,'"',1,6);    --得到ORA-12899后面第六个"的位置
         str3:=substr(str1,num4+1,num5-num4-1);  --得到字段名
         
         num6:=instr(str1,':',1,2);    --得到ORA-12899后面第二个:的位置
         num7:=instr(str1,',',1,1);    --得到ORA-12899后面第1个,的位置
         str5:=substr(str1,num6+1,num7-num6-1);  --得到输入的长度
         
         num8:=instr(str1,':',1,3);    --得到ORA-12899后面第二个:的位置
         num9:=instr(str1,')',1,1);    --得到ORA-12899后面第1个,的位置
         str6:=substr(str1,num8+1,num9-num8-1);  --得到最大的长度
           
         --得到对应的字段注释
         select t.comments into str4 from SYS.USER_COL_COMMENTS t where t.column_name=str3 and t.table_name=str2;
         
         Result:=str4||'长度超出限制,最大字符数为'||str6||',您输入的字符数为'||str5||'.';
        elsif  instr(message, 'ORA-01400')>0  then
           
         num1:=instr(message,'ORA-01400'); --得到 ORA-01400的所在位置
         str1:=substr(message,num1);    --得到ORA-01400后面的所有字符 
         num2:=instr(str1,'"',1,3);    --得到ORA-01400后面第三个"的位置
         num3:=instr(str1,'"',1,4);    --得到ORA-01400后面第四个"的位置
         str2:=substr(str1,num2+1,num3-num2-1);  --得到表名
         num4:=instr(str1,'"',1,5);    --得到ORA-01400后面第五个"的位置
         num5:=instr(str1,'"',1,6);    --得到ORA-01400后面第六个"的位置
         str3:=substr(str1,num4+1,num5-num4-1);  --得到字段名
         
          --得到对应的字段注释
         select t.comments into str4 from SYS.USER_COL_COMMENTS t where t.column_name=str3 and t.table_name=str2;
         
          Result:=str4||'不能为空,请输入内容.';
       elsif  instr(message, 'ORA-01438')>0  then
           
      
          Result:=str4||'数字长度超出限制,请检查!';
        else
          
            Result:=message;
        end if;
        
          return(Result);
    end f_czl_geterror;

        然后我们在存储过程的异常处理中用上这个函数,如:

    Exception
        When Others Then
         rollback;
         dbms_output.put_line(f_czl_geterror(sqlerrm));
         Raise_Application_Error(-20000,f_czl_geterror(sqlerrm));   

        再测试看看,我们得到了:

    账号长度超出限制,最大字符数为 20,您输入的字符数为 35.

        起码有的用户看得懂了是吧,咱们的目标算是达成了.

    小结

      上文介绍了如何将oracle的系统异常信息转换成用户看得懂的信息.其实这只是一种补救的措施罢了,某种程度上是'欺骗'了用户,程序是正常运行的,但是不能否认的是我们的程序依然不完善.但是,有的补救好过没有是吧.最后,如果您有更好的建议,请不吝指教.

  • 相关阅读:
    左孩子右兄弟的字典树
    UVA 1401 Remember the Word
    HDOJ 4770 Lights Against Dudely
    UvaLA 3938 "Ray, Pass me the dishes!"
    UVA
    Codeforces 215A A.Sereja and Coat Rack
    Codeforces 215B B.Sereja and Suffixes
    HDU 4788 Hard Disk Drive
    HDU 2095 find your present (2)
    图的连通性问题—学习笔记
  • 原文地址:https://www.cnblogs.com/caizl/p/4379959.html
Copyright © 2011-2022 走看看