`
mmclxq
  • 浏览: 6785 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
最近访客 更多访客>>
社区版块
存档分类
最新评论

Oracle自定义异常收集(一)

阅读更多

Oracle PL/SQL异常处理类型: Oracle中异常分为预定义例外,非预定义例外和自定义例外三种。处理预定义异常预定义异常是指由PL/SQL所提供的系统异常.当PL/SQL应用程序违反了Oralce规则或系统限制时,则会隐含的触发一个内部异常。当PL/SQL应用程序违反了Oralce规则或系统限制时,则会隐含的触发一个内部异常。 PL/SQL为开发人员提供了二十多个预定义异常:

1、ACCESS_INTO_NULL 该异常对应于ORA-06530错误.当开发对象类型应用时,如果没有初始化对象,直接为对象属性赋值,该异常触发。
     DECLARE emp emp_type; BEGIN emp.name:='SCOTT';
     EXCEPTION
     WHEN ACCESS_INTO_NULL THEN
     DBMS_OUTPUT.PUT_LINE('首先初始化对象emp');
     END;


2、CASE_NOT_FOUND 对应于ORA-06592错误.在CASE语句时,如果WHEN子句没有包含必须的条件分支,并且没有仓含ELSE子句,被触发。
    DECLARE v_sal emp.sal%TYPE;
    BEGIN SELECT sal INTO v_sal FROM emp WHERE empno=&&no;
    CASE
    WHEN v_sal?1000 THEN
        UPDATE emp SET sal=sal+100 WHERE empno=&no;
    WHEN v_sal?2000 THEN UPDATE emp SET sal=sal+150
    WHERE empno=&no; WHEN v_sal?3000 THEN
        UPDATE emp SET sal=sal+200
    WHERE empno=&no;
    END CASE;
    EXCEPTION WHEN CASE_NOT_FOUND THEN
         DBMS_OUTPUT.PUT_LINE('在CASE语句中没有与'||v_sal||'相关的条件.');
    END;

 

3、COLLECTION_IS_NULL 对应于ORA-06531错误.在给集合元素(嵌套表或VARRAY类型)赋值前,必须首先寝化集合元素.否则触发该异常。

    DECLARE TYPE ename_table_type IS TABLE OF emp.ename%TYPE;
    ename_table ename_table_type;
    BEGIN
         SELECT ename INTO ename_table(2) FROM emp WHERE empno=&no;
         DBMS_OUTPUT.PUT_LINE('雇员名: '||ename_table(2));
   EXCEPTION WHEN COLLECTION_IS_NULL THEN
   DBMS_OUTPUT.PUT_LINE('必须初始化集合元素.');
   END;

4、CURSOR_ALREADY_OPEN 对应于ORA-06511错误.当重新打开已经打开的游标时,会隐含地触发该异常。

    DECLARE CURSOR emp_cursor IS SELECT ename,sal FROM emp;
    BEGIN OPEN emp_cursor;
    FOR emp_record IN emp_cursor
    LOOP
       DBMS_OUTPUT.PUT_LINE(emp_record.ename);
    END LOOP;
    EXCEPTION WHEN CURSOR_ALREADY_OPEN THEN
    DBMS_OUTPUT.PUT_LINE('游标已经打开.');
    END;

5、DUP_VAL_ON_INDEX 对应于ORA-00001错误,当在惟一索引所对应的列上键入重复值时触发。

    BEGIN
       UPDATE dept SET deptno=&new_no WHERE deptno=&old_no;
       EXCEPTION WHEN DUP_VAL_ON_INDEX THEN
          DBMS_OUTPUT.PUT_LINE('在deptno列上不能出现重复值.'); 
       END;

6、.INVALID_CURSOR 对应于ORA-01001错误.当试图在不合法的游标上执行操作时触发.如从未打开的游标取数据,关闭未打开的游标等。
    DECLARE CURSOR emp_cursor IS SELECT ename,sal FROM emp;
    emp_record emp_cursor%ROWTYPE;
    BEGIN 
    FETCH emp_cursor INTO emp_record;
    CLOSE emp_cursor;
    EXCEPTION WHEN INVALID_CURSOR THEN
        DBMS_OUTPUT.PUT_LINE('请检查游标是否已经打开.');
    END;

7、INVALID_NUMBER 对应于ORA-01722错误.当内嵌SQL语句不能有效地将字符转变成数字时触发.如数值100被写成"1oo"。
    BEGIN UPDATE emp SET sal=sal+'100';
    EXCEPTION WHEN INVALID_NUMBER THEN
         DBMS_OUTPUT.PUT_LINE('输入的数字不正确.'); 
    END;

8、NO_DATA_FOUND 对应于ORA-01403错误.当执行SELECT INOT未返回行,或引用了索引表未初始化元素时触发。
    DECLARE v_sal emp.sal%TYPE;
    BEGIN SELECT sal INTO v_sal FROM emp WHERE lower(ename)=lower('&name');
    EXCEPTION WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('不存在该雇员.');
    END;

9、TOO_MANY_ROWS 对应于ORA-01422错误,当执行SELECT INTO语句时,如果返回超过一行触发该异常。
    DECLARE v_ename emp.ename%TYPE;
    BEGIN SELECT ename INTO v_ename FROM emp WHERE sal=&sal;
    EXCEPTION WHEN TOO_MANY_ROWS THEN
        DBMS_OUTPUT.PUT_LINE('返回多行.');
    END;

10、ZERO_DIVIDE 对应于ORA-01476错误.当运行PL/SQL块时,如果使用数据值除0触发该异常。
    DECLARE
       num1 INT:=100;
       num2 INT:=0;
       num3 NUMBER(6,2);
    BEGIN 
       num2:=num1/num2;
    EXCEPTION WHEN ZERO_DIVIDE THEN
       DBMS_OUTPUT.PUT_LINE('分母不能为0.');
    END;

11、SUBSCRIPT_BEYOND_COUNT 对应于ORA-06533错误.当使用嵌套表或VARRAY元素时,如果下标越界触发该异常.
   DECLARE TYPE emp_array_type IS VARRAY(20) OF VARCHAR2(10);
    emp_array emp_array_type;
    BEGIN
       emp_array:=emp_array_type('SCOTT','MARY');
       DBMS_OUTPUT.PUT_LINE(emp_array(3));
     EXCEPTION WHEN SUBSCRIPT_BEYOND_COUNT THEN
          DBMS_OUTPUT.PUT_LINE('下标越界.');
     END;

12、SUBSCRIPT_OUTSIDE_LIMIT 对应于ORA-06532错误.当使用嵌套表或VARRAY元素时,如果下标为负值触发该异常.
    DECLARE TYPE emp_array_type IS varray(20) OF VARCHAR2(10);
      emp_array emp_array_type;
    BEGIN
       emp_array:=emp_array_type('SCOTT','MARY');
       DBMS_OUTPUT.PUT_LINE(emp_array(-1));
    EXCEPTION WHEN SUBSCRIPT_OUTSIDE_LIMIT THEN
       DBMS_OUTPUT.PUT_LINE('下标不能是负数.');
    END;

13、VALUE_ERROR 对应于ORA-06502错误.当在PL/SQL块中执行赋值操作时,如果变量长度不足则触发该异常.
    DECLARE v_ename VARCHAR2(5);
    BEGIN
        SELECT ename INTO v_ename FROM emp WHERE empno=&no; 
        DBMS_OUTPUT.PUT_LINE(v_ename);
    EXCEPTION WHEN VALUE_ERROR THEN
        DBMS_OUTPUT.PUT_LINE('变量长度不够.');
    END;

 

其它预定义异常:

1.LONIN_DENIED 对应于ORA-01017错误.当PL/SQL应用程序要连接Oracle数据库时,如果密码错误则触发该异常.

2.NOT_LOGGED_ON 对应于ORA-01012错误.如果程序没连接Oracle数据库,那么执行PL/SQL访问数据库时触发该异常.

3.PROGRAM_ERROR 对应于ORA-06501.如果出现该错误,则表示PL/SQL内部问题,用户可能需要重新安装数据字典和PL/SQL系统包.

4.ROWTYPE MISMATCH 对应于ORA-06504错误.赋值时,宿主游标变量和PL/SQL游标变量的返回类型不兼容时触发该异常.

5.SELF_IF_NULL 对应于ORA-30625.当使用对象类型时,如果在NULL实例上调用成员方法则触发该异常.

6.STORAGE_ERROR 对应于ORA-06500错误.PL/SQL块运行时,如果走出内在空间或内在被损坏则触发该异常.

7.SYS_INVALID_ROWID 对应于ORA-01410错误.当将字符串转变为ROWID时,如果使用了无效的字符串则触发该异常.

8.TIMEOUT_ON_RESOURCE 对应于ORA-00051错误.Oracle在等待资源超出现超时错误时触发该异常.

 

分享到:
评论

相关推荐

    自定义表单web工程

    JDK 1.4是较早的一个版本,它引入了诸如异常链、注解(Annotation)和NIO(New Input/Output)等特性,为Java开发提供了更多便利。 而Tomcat则是这个Web工程的服务器,它是Apache软件基金会的Jakarta项目中的一个...

    zabbix 监控 oracle

    7. **使用相关工具**:压缩包中的相关工具可能包括自定义脚本或程序,用于扩展Zabbix的功能,例如自动发现Oracle实例、收集特定性能指标或处理特定警报。 在实际操作中,你还需要关注一些关键的Oracle监控指标,如...

    Oracle.zip压缩包

    10. **PL/SQL增强**:Oracle的内置编程语言PL/SQL在11g中得到了扩展,增加了诸如游标变量、异常处理、包的使用等方面的改进。 在安装"orgcle"之前,你需要确保系统满足Oracle 11g的硬件和软件需求,包括操作系统...

    oracle压力测试工具 java版

    "Oracle压力测试工具 Java版" 提供了一个用Java编写的解决方案,用于模拟大量并发用户请求,以测试Oracle数据库的性能和耐压性。 这个工具可能包含以下关键组件和功能: 1. **并发执行**:Java版的Oracle压力测试...

    VC++之数据库技术之用ADO连接Oracle数据库[收集].pdf

    ADO是Microsoft提供的一个接口,允许开发者方便地访问各种数据源,包括Oracle。 首先,创建一个对话框应用程序是开始的基本步骤。在Visual Studio中,你可以选择“MFC AppWizard”,然后选择“Dialog based”来创建...

    Oracle® Database 2 Day + Performance Tuning Guide

    《Oracle® Database 2 Day + Performance Tuning Guide》是一本由Oracle官方提供的、针对Oracle 10g Release 2 (10.2)版本数据库性能调优的专业指南。本书主要介绍了如何使用Oracle Diagnostics Pack、Oracle ...

    Oracle PL SQL 程序设计 下 第五版

    - 用户可以自定义异常,或者使用预定义的系统异常。 7. **存储过程与函数** - 存储过程是一组PL/SQL语句,可以接收参数,执行后不返回值。 - 函数类似于存储过程,但必须返回一个值,可以作为查询的一部分使用。...

    Oracle Database 11g PLSQL编程实战

    - RAISE:引发自定义异常。 5. **PL/SQL与SQL的交互** - DML语句(INSERT, UPDATE, DELETE):在PL/SQL中执行对数据库表的操作。 - SELECT INTO:从查询结果中提取单行数据到PL/SQL变量。 - BULK COLLECT:批量...

    oracle之监控报警

    8. **监控脚本和自定义解决方案**: 除了Oracle内置的监控工具,DBA还可以编写自定义脚本来监测特定的性能指标,结合DBMS_MAIL发送定制化的报警邮件。 综上所述,Oracle的监控报警机制涵盖了多种工具和技术,从基础...

    Oracle参考书籍目录

    - **Statspack 的作用**:了解Statspack在Oracle 9i中的角色,即收集性能统计数据以供分析。 - **安装与配置**:学习如何安装和配置Statspack,以便能够收集性能数据。 - **性能报告**:掌握如何生成和解读Statspack...

    oracle循环游标

    例如,当尝试更新不存在的记录时,可以引发自定义异常或使用预定义的`sql%notfound`条件。这有助于开发者更好地控制程序流程,确保在遇到错误时能够采取适当的措施,如输出错误信息或执行回滚操作。 另外,代码还...

    oracle监控系统

    Oracle 监控系统是一款专为数据库管理员(DBA)设计的工具,其程序版本为1.0.2,采用先进的Qt4框架进行开发。Qt4是一个跨平台的应用程序开发框架,支持多种操作系统,如Windows、Linux和macOS,使得这款监控工具具有...

    oracle 中 pl/sql 只是学习方法

    5. **异常处理**:PL/SQL的异常处理机制允许我们在遇到错误时执行特定的代码块,通过RAISE语句自定义异常,或者使用预定义的系统异常。 6. **事务管理**:在PL/SQL中,可以使用BEGIN、COMMIT、ROLLBACK语句进行事务...

    Oracle Enterprise Manager Getting Started with the Oracle Standa

    2. **监控与警报**:Oracle标准管理包允许实时监控数据库性能,通过警报机制提供异常检测,帮助管理员及时发现并解决问题。这部分可能会介绍如何设置性能阈值、创建自定义警报和管理警报策略。 3. **性能优化**:...

    json格式数据到入oracle数据库java源码

    - 使用BULK COLLECT和FORALL语句:Oracle支持批量收集查询结果并一次插入多个行,显著提升性能。 - 索引和表分区:根据数据特点创建索引或使用分区策略,加快查询和插入速度。 综上所述,从JSON格式数据到Oracle...

    Overview of Oracle Business Intelligence Applications

    Oracle BI应用程序提供了一系列强大的分析工具,帮助用户发现模式、趋势和异常。这些工具支持各种分析类型,包括描述性、预测性和规范性分析。通过使用Oracle BI,企业能够更好地了解其业务运作方式,并采取行动以...

    Oracle基础知识习题

    一、Oracle SQL基础 1. 数据查询:学习SQL的核心在于掌握如何从数据库中提取信息。使用SELECT语句,可以指定列名、表名、条件等,例如`SELECT column1, column2 FROM table WHERE condition`。 2. 数据插入:INSERT...

    oracle使用经验

    - 这个标签可能暗示文章中会涉及Oracle的源码分析或自定义工具的开发,这将帮助读者更深入地理解Oracle的工作原理和扩展其功能。 综上所述,“Oracle使用经验”涵盖了Oracle数据库的多个重要方面,无论是对于新手...

    用户管理系统----在oracle下

    在Java中,Spring框架常被用来实现MVC模式,但本项目可能采用了自定义的方式实现这一模式。 7. **安全性**:用户管理系统需要考虑安全性问题,如防止SQL注入、密码加密存储、session管理等。对于密码,通常会进行...

Global site tag (gtag.js) - Google Analytics