`
lxy2330
  • 浏览: 469464 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ORACLE EXCEPTION总结

阅读更多

文章分类:数据库 关键字: oracle

一 ORACLE EXCEPTION只包含三种异常:
1.System Error,例如:Out of memory---由Oracle定义并由PL/SQL Runtime引擎在检测到错误所  产生的异常,包含在STANDARD PACKAGE中。
2.用户行为导致的Error(重点介绍)
3.应用程序给出的Warning.
二 捕获异常的机制:
  用一种异常句柄来捕捉和响应错误。异常句柄提供了一种类似事件驱动的模式,也就是说,不管在何时何地发生错误,都能被同一代码捕获到。
  无论在系统或程序中,一旦出现错误时,可执行程序被中断,都会将控制权交与异常处理代码,异常处理代码处理完成后,控制权会回到外围模块的代码中。例如;
 
Java代码 复制代码
  1. BEGIN   
  2.      INSERT INTO A VALUES A_ROWTYPE;   
  3.      V_SUCC_FLG := '1';   
  4.   EXCEPTION   
  5.      WHEN OTHERS THEN   
  6.        V_SQL_ERR_MSG := SQLERR;   
  7.   END;  
BEGIN
     INSERT INTO A VALUES A_ROWTYPE;
     V_SUCC_FLG := '1';
  EXCEPTION
     WHEN OTHERS THEN
       V_SQL_ERR_MSG := SQLERR;
  END;

  如果在insert出现Exception时,第三行将不再之行,而是直接进入到第五行,执行完后,会回到调用此Procedure的外围方法上。
三 用户定义的异常:
   1.自定义异常:
     当我们在实际应用中总会碰到一些异常是无法在系统中预先被定义的,需要手动去捕获,同时抛出来,告诉使用系统的终端用户具体的错误信息。在PL/SQL中,用Raise手动产生。例如:
  
Java代码 复制代码
  1. PROCEDURE P_CALCU_POL_PREM(I_POL_ID IN VARCHAR2)AS   
  2.    INVALID_POLICY_NO EXCEPTION;   
  3.    INVALID_PRODUCT_NO EXCEPTION;   
  4.    BEGIN   
  5.       BEGIN   
  6.         SELECT CM.POL_NO INTO V_POL_NO FROM T_CONTR_MST CM WHERE CM.POL_ID := I_POL_ID;   
  7.         SELECT CP.PRD_NO INTO V_PRD_NO FROM T_CONTR_PRD CP WHERE CP.POL_ID := I_POL_ID;   
  8.          
  9.       EXCEPTION   
  10.         WHEN INVALID_POLICY_NO THEN   
  11.             RAISE;   
  12.         WHEN INVALID_PRODUCT_NO THEN   
  13.             RAISE;   
  14.     
  15.       END;   
  16.       
  17.    END P_CALCU_POL_PREM;  
PROCEDURE P_CALCU_POL_PREM(I_POL_ID IN VARCHAR2)AS
   INVALID_POLICY_NO EXCEPTION;
   INVALID_PRODUCT_NO EXCEPTION;
   BEGIN
      BEGIN
        SELECT CM.POL_NO INTO V_POL_NO FROM T_CONTR_MST CM WHERE CM.POL_ID := I_POL_ID;
        SELECT CP.PRD_NO INTO V_PRD_NO FROM T_CONTR_PRD CP WHERE CP.POL_ID := I_POL_ID;
      
      EXCEPTION
        WHEN INVALID_POLICY_NO THEN
            RAISE;
        WHEN INVALID_PRODUCT_NO THEN
            RAISE;
 
      END;
   
   END P_CALCU_POL_PREM;

   2 为非定义异常关联一个名字:
     一般可以用RAISE_APPLICATION_ERROR来定义一个包含ERROR_CODE和描述的异常。
     首先,需要用到PRAGMA EXCEPTION_INIT(EXCEPTION, INTEGER),这样就把非预定义异常  同Error_Code相关联起来了。Notes:ERROR_Code只能从-20000~-20999中取值,并且因为EXCEPTION_INIT是编译时运行的函数,所以必须放在PACKAGE里的声明部分。例如:
  INVALID_POLICY_NO EXCEPTION;
  PRAGMA EXCEPTION_INIT(INVALID_POLICY_NO, -20011);
四 自定义异常的触发:
   对于自定义的异常,SQLCODE = 1.通常抛出异常,都通过RAISE.而Raise有以下三种形式:
   ◎ RAISE EXCEPTION
   ◎ RAISE PACKAGE.EXCEPTION
   ◎ RAISE   
   PL/SQL使用RAISE_APPLICATION_ERROR过程来生成一个具体描述的异常。例如:
  
Java代码 复制代码
  1. PROCEDURE P_CALCU_POL_PREM(I_POL_ID IN VARCHAR2)AS   
  2.    INVALID_POLICY_NO EXCEPTION;   
  3.    INVALID_PRODUCT_NO EXCEPTION;   
  4.    BEGIN   
  5.       BEGIN   
  6.         SELECT CM.POL_NO INTO V_POL_NO FROM T_CONTR_MST CM WHERE CM.POL_ID := I_POL_ID;   
  7.         SELECT CP.PRD_NO INTO V_PRD_NO FROM T_CONTR_PRD CP WHERE CP.POL_ID := I_POL_ID;   
  8.          
  9.       EXCEPTION   
  10.         WHEN INVALID_POLICY_NO THEN   
  11.             RAISE_APPLICATION_ERROR(ERROR_CODE,ERROR_MSG) ;   
  12.         WHEN INVALID_PRODUCT_NO THEN   
  13.             RAISE ....;   
  14.     
  15.       END;   
  16.       
  17.    END P_CALCU_POL_PREM;  
PROCEDURE P_CALCU_POL_PREM(I_POL_ID IN VARCHAR2)AS
   INVALID_POLICY_NO EXCEPTION;
   INVALID_PRODUCT_NO EXCEPTION;
   BEGIN
      BEGIN
        SELECT CM.POL_NO INTO V_POL_NO FROM T_CONTR_MST CM WHERE CM.POL_ID := I_POL_ID;
        SELECT CP.PRD_NO INTO V_PRD_NO FROM T_CONTR_PRD CP WHERE CP.POL_ID := I_POL_ID;
      
      EXCEPTION
        WHEN INVALID_POLICY_NO THEN
            RAISE_APPLICATION_ERROR(ERROR_CODE,ERROR_MSG) ;
        WHEN INVALID_PRODUCT_NO THEN
            RAISE ....;
 
      END;
   
   END P_CALCU_POL_PREM;

   在Handle Exception的时候,一般会做数据回滚(ROLLBACK),这里涉及到SAVEPOINT的问题,会对在同一事务里所有的DML操作进行还原。
五 异常的确定和分析:
   PL/SQL提供了一些内置的函数进行分析处理。
   1.SQLCODE:
     当没有异常产生时候,SQLCODE=0,反之为1.
   2 SQLERRM:
     SQLERRM---接受返回值,通常长度不超过512B.如果超过时,需要使用DBMS_UTILITY.FORMAT_ERROR_STACK.但在实际应用中,一般都会对其进行重新包装的。
   3.DBMS_UTILITY.FORMAT_ERROR_STACK。
举个实例:
Java代码 复制代码
  1. UNKNOWN_ERR_CODE EXCEPTION;   
  2. PRAGMA EXCEPTION_INIT(UNKNOWN_ERR_CODE, -20099);   
  3. PROCEDURE P_HANDLE_EXCEPTION(I_ERR_CODE IN NUMBER)AS   
  4. BEGIN   
  5.    SELECT SR.MSG_DES INTO V_MSG_DES   
  6.       FROM T_STRING_RESOURCE SR WHERE SR.MSG_ID = I_ERR_CODE;   
  7.    IF V_MSG_DES IS NOT NULL THEN   
  8.    IF (I_ERR_CODE = 20091) THEN   
  9.      RAISE_APPLICATION_ERROR(I_ERR_CODE,V_MSG_DES);   
  10.    ELSIF (I_ERR_CODE = 20092) THEN   
  11.      RAISE_APPLICATION_ERROR(I_ERROR_CODE,V_MSG_DES||'I_ERR_CODE')   
  12.    END IF;   
  13.    ELSE   
  14.      RAISE_APPLICATION_ERROR(UNKNOWN_ERR_CODE);   
  15.    END IF;   
  16. END P_HANDLE_EXCEPTION;   
  17. PROCEDURE P_CALCU_PRD_PREM(I_POL_ID IN VARCHAR2)AS   
  18. V_PROD_PREM NUMBER(10,2);   
  19. V_PRD_INSURE_NUM NUMBER;   
  20. BEGIN   
  21.    BEGIN   
  22.       SELECT CP.PRD_PREM,CP.PRD_INSURE_NUM INTO V_PROD_PREM,V_PRD_INSURE_NUM FROM T_CONTR_PROD CP WHERE CP.POL_ID = I_POL_ID;   
  23.       V_PRD_AVG_PREM := V_PROD_PREM / V_PRD_INSURE_NUM;   
  24.    EXCEPTION   
  25.       P_HANDLE_EXCEPTION(SQLERRM);    
  26.    END;   
  27. END P_CALCU_PRD_PREM;  
分享到:
评论

相关推荐

    *oracle存储过程总结*oracle存储过程总结*

    根据提供的文件信息,我们可以归纳出以下Oracle存储过程的相关知识点: ### Oracle存储过程基础概念 ...以上是基于提供的部分内容对Oracle存储过程进行的总结,包含了从基础概念到具体应用实例的全面解析。

    oracle变量的总结

    ### Oracle变量的总结 在Oracle数据库管理中,变量的使用是一项基本且重要的技能。通过合理的变量定义与使用,可以极大提升SQL脚本的灵活性与可维护性。本文将围绕Oracle中的变量定义、类型以及如何在实际操作中...

    在.NET中调用Oracle存储过程经验总结.doc

    catch (OracleException ex) { Console.WriteLine("Exception occurred!"); Console.WriteLine("The exception message is: {0}", ex.Message); } finally { Console.WriteLine("------------------ End ---...

    C#连Oracle 类

    catch (System.Data.OracleClient.OracleException ex) { connection.Close(); throw new Exception(ex.Message); } return ds; } } ``` 此方法接受一个SQL查询语句作为输入,并返回一个填充了查询结果的`...

    应届生 java开发工程师 测试工程师 oracle面试总结

    - 异常处理:理解WHENEVER SQLERROR、BEGIN...EXCEPTION...END结构。 8. **数据库性能监控**: - 使用V$视图来监控数据库性能,如V$SESSION、V$PGA Aggregate Target等。 - AWR(Automatic Workload Repository...

    PLSQL Developer无法连接64位Oracle的解决方法

    #### 总结 通过上述步骤,我们解决了PLSQL Developer无法连接64位Oracle的问题。尽管官方尚未提供对64位Oracle的支持,但通过上述变通方案,仍然可以让开发人员高效地利用PLSQL Developer这款强大的工具。希望本文...

    Oracle总结.docx

    Oracle总结 Oracle是一种关系型数据库管理系统,广泛应用于各种行业。下面是 Oracle 中的一些重要知识点总结: 1. 在 Oracle 中关于 CLOB 类型数据的插入: Oracle 中的 CLOB(Character Large OBject)类型是...

    oracle异常总结

    处理这类异常需要先定义异常,然后通过`EXCEPTION_INIT`伪过程将异常与特定的Oracle错误代码关联起来。例如,处理ORA-02291(外键约束违反)异常: ```sql DECLARE e_constraint_violation EXCEPTION; PRAGMA ...

    oracle自定义函数总结

    #### 五、总结 本文详细介绍了Oracle自定义函数的定义方法、常见用途及一些高级特性。通过这些自定义函数,我们可以更好地管理和优化数据库中的数据处理逻辑。掌握这些技术对于提高开发效率、减少重复工作量具有...

    c#连接oracle方法 本地无需安装oracle 内有文档说明Oracle.ManagedDataAccess.dll

    总结起来,通过C#和`Oracle.ManagedDataAccess.dll`,开发者可以在本地无Oracle客户端的环境下,轻松实现对Oracle数据库的连接和操作。这为开发人员提供了极大的便利,减少了对硬件资源的依赖,同时也简化了部署流程...

    oracle学习总结

    PL/SQL是Oracle的编程语言,包含流程控制结构,如IF-THEN-ELSIF-ELSE、CASE、WHILE和FOR循环,以及异常处理(BEGIN-EXCEPTION-END)。这些控制结构使得在数据库中编写复杂的业务逻辑成为可能。 通过深入理解和实践...

    用java调用oracle存储过程总结

    } } catch (SQLException ex1) { } } }}```总结与注意事项调用Oracle存储过程在Java中主要使用`CallableStatement`,通过占位符`?`来代表参数,并使用`setXXX`方法设置IN参数,`registerOutParameter`注册OUT或IN...

    Oracle经典教程 Oracle基本知识

    - **异常处理**:学习如何使用EXCEPTION块来捕获并处理错误。 - **游标**:掌握游标的使用技巧,提高数据处理效率。 ##### 3.4 Oracle基本管理 - **用户和权限管理**:创建用户账户,分配适当的权限。 - **角色...

    linux安装oracle图形化界面问题处理

    Linux安装Oracle图形化界面时经常会遇到各种问题,本文将总结这些问题的解决方法。 一、错误描述:xlib connection to ":0.0" refused by server 解决方案:此错误是由于用户身份问题引起的,可以通过切换到root...

    System.Data.OracleClient

    5. OracleException:表示在处理Oracle数据库时出现的错误或异常。 二、OracleClient的使用步骤 1. 创建连接:使用OracleConnection类的构造函数,指定连接字符串来创建数据库连接。连接字符串通常包括服务器名称...

    访问ORACLE存储过程

    } catch (OracleException ex) { Console.WriteLine("Exception occurred!"); Console.WriteLine("The exception message is: {0}", ex.Message.ToString()); } finally { Console.WriteLine("------------------...

    oracle 常用应用操作总结

    以下是对Oracle常用应用操作的详细总结: 1. **变量赋值与判断语句**: - 在Oracle SQL中,给变量赋值时不能使用等号(=),而是使用冒号等于(:=)操作符。例如:`variable_name := value;` - Oracle的条件判断...

    Oracle调用存储过程总结

    ### 总结 通过上述示例可以看出,在Oracle中创建和调用存储过程是非常灵活且强大的。存储过程不仅可以接收和返回各种类型的数据,还可以使用复杂的逻辑处理,如游标等高级特性,极大地提高了应用程序的性能和维护性...

    oracle自定义异常

    - [Oracle官方文档 - PL/SQL异常处理](https://docs.oracle.com/en/database/oracle/oracle-database/19/plsls/PL-SQL-exception-handling.html) - [Oracle PL/SQL教程 - 异常处理]...

    ORACLE 异常处理总结.doc

    Oracle 异常处理是PL/SQL编程中的关键组成部分,它允许开发者优雅地处理程序执行过程中可能出现的错误,确保系统的稳定性和可靠性。异常处理是通过异常情况(EXCEPTION)和异常处理器(EXCEPTION HANDLER)来实现的...

Global site tag (gtag.js) - Google Analytics