zoukankan      html  css  js  c++  java
  • Oracle异常

    Oracle异常分类                                                                                                                        

    1. Oracle预定义异常(即已定义的内部异常)
    2. Oracle非预定义异常(即未定义的内部异常)
    3. 用户自定义异常

    常见的预定义异常                                                                                                                    

    NO_DATA_FOUND 语句没有查询出符合条件的记录返回
    TOO_MANY_ROWS 语句符合条件的记录有多条返回
    DUP_VAL_ON_INDEX 数据库表中的某一条有唯一索引,程序试图存储两个重复的值
    VALUE_ERROR 在转换字符类型,截取或长度受限发生异常,如声明的长度比字符短
    STORAGE_ERROR 内存溢出
    ZERO_DRIVIDE 除数为零
    CAST_NOT_FOUND case语句没有相匹配的条件,同时也没有else语句
    CURSOR_ALREADY_OPEN 程序试图打开一个已经打开的游标
    TIMEOUT_ON_RESOURCE 系统在等待某一资源,系统超时
    ACCESS_INTO_NULL 为对象赋值前必需初始化对象
    INVALID_NUMBER 不能将字符转换成数字
    TRANSACTION_BACKED_OUT 由于死锁提交被退出

    常见的非预定义异常                                                                                                                   

    如果要处理未声明的内部异常,必须使用OTHERS异常处理器或PRAGMA EXCEPTION_INIT
    others
    pragma exception_init(exception_name,-Oracle_error_number)

    用法:

    DECLARE 
      deadlock_detected EXCEPTION; 
      PRAGMA EXCEPTION_INIT(deadlock_detected, -60);  --关联一个oracle内部的错误号
    BEGIN 
      ... -- Some operation that causes an ORA-00060 error 
      EXCEPTION 
      WHEN deadlock_detected THEN  --由oracle系统自动触发
      -- handle the error 
    END;

    ORA-00001: 违反唯一约束条件 (.) 
    ORA-00017: 请求会话以设置跟踪事件 
    ORA-00018: 超出最大会话数 
    ORA-00019: 超出最大会话许可数 
    ORA-00020: 超出最大进程数 () 
    ORA-00021: 会话附属于其它某些进程;无法转换会话 
    ORA-00022: 无效的会话 ID;访问被拒绝 
    ORA-00023: 会话引用进程私用内存;无法分离会话 
    ORA-00024: 单一进程模式下不允许从多个进程注册 
    ORA-00025: 无法分配  
    ORA-00026: 丢失或无效的会话 ID 
    ORA-00027: 无法删去当前会话 
    ORA-00028: 您的会话己被删去 
    ORA-00029: 会话不是用户会话 
    ORA-00030: 用户会话 ID 不存在。 
    ORA-00031: 标记要删去的会话 
    ORA-00032: 无效的会话移植口令 
    ORA-00033: 当前的会话具有空的移植口令 
    ORA-00034: 无法在当前 PL/SQL 会话中  
    ORA-00035: LICENSE_MAX_USERS 不能小于当前用户数 
    ORA-00036: 超过递归 SQL () 级的最大值 
    ORA-00037: 无法转换到属于不同服务器组的会话 
    ORA-00038: 无法创建会话: 服务器组属于其它用户 
    ORA-00050: 获取入队时操作系统出错 
    ORA-00051: 等待资源超时 
    ORA-00052: 超出最大入队资源数 () 
    ORA-00053: 超出最大入队数 
    ORA-00054: 资源正忙,要求指定 NOWAIT 
    ORA-00055: 超出 DML 锁的最大数 
    ORA-00056: 对象 '.' 上的 DDL 锁以不兼容模式挂起 
    ORA-00057: 超出临时表锁的最大数 
    ORA-00058: DB_BLOCK_SIZE 必须为才可安装此数据库 (非 ) 
    ORA-00059: 超出 DB_FILES 的最大值 
    ORA-00060: 等待资源时检测到死锁 
    ORA-00061: 另一个例程设置了不同的 DML_LOCKS 
    ORA-00062: 无法获得 DML 全表锁定;DML_LOCKS 为 0 
    ORA-00063: 超出 LOG_FILES 的最大数 
    ORA-00064: 对象过大以至无法分配在此 O/S (,) 
    ORA-00065: FIXED_DATE 的初始化失败 
    ORA-00066: LOG_FILES 为  但需要成为  才可兼容 
    ORA-00067: 值  对参数  无效;至少必须为  
    ORA-00068: 值  对参数  无效,必须在  和  之间 
    ORA-00069: 无法获得锁定 -- 禁用了表锁定 
    ORA-00070: 命令无效 
    ORA-00071: 进程号必须介于 1 和  之间 
    ORA-00072: 进程""不活动 
    ORA-00073: 命令  介于  和  个参数之间时使用 
    ORA-00074: 未指定进程 
    ORA-00075: 在此例程未找到进程 "" 
    ORA-00076: 未找到转储  
    ORA-00077: 转储  无效 
    ORA-00078: 无法按名称转储变量 
    ORA-00079: 未找到变量  
    ORA-00080: 层次  指定的全局区域无效 
    ORA-00081: 地址范围 [,) 不可读 
    ORA-00082:  的内存大小不在有效集合 [1], [2], [4] 之内 
    ORA-00083: 警告: 可能损坏映射的 SGA  
    ORA-00084: 全局区域必须为 PGA, SGA 或 UGA 
    ORA-00085: 当前调用不存在 
    ORA-00086: 用户调用不存在 
    ORA-00087: 命令无法在远程例程上执行 
    ORA-00088: 共享服务器无法执行命令 
    ORA-00089: ORADEBUG 命令中无效的例程号 
    ORA-00090: 未能将内存分配给群集数据库 ORADEBUG 命令 
    ORA-00091: LARGE_POOL_SIZE 至少必须为  
    ORA-00092: LARGE_POOL_SIZE 必须大于 LARGE_POOL_MIN_ALLOC 
    ORA-00093:  必须介于  和  之间 
    ORA-00094:  要求整数值 
    ORA-00096: 值  对参数  无效,它必须来自  之间 
    ORA-00097: 使用 Oracle SQL 特性不在 SQL92  级中 
    ORA-00099: 等待资源时发生超时,可能是 PDML 死锁所致 
    ORA-00100: 未找到数据 
    ORA-00101: 系统参数 DISPATCHERS 的说明无效 
    ORA-00102: 调度程序无法使用网络协议  
    ORA-00103: 无效的网络协议;供调度程序备用 
    ORA-00104: 检测到死锁;全部公用服务器已锁定等待资源

    自定义异常                                                                                                                                 

    预定义异常和非预定义异常都与Oracle内部错误有关,并且当出现Oracle错误时会隐含触发相应异常;  
    而自定义异常与Oracle错误没有任何关联,它是由开发人员为特定情况所定义的异常,需手工触发。
     步骤
    1.定义异常
    2.触发异常(RAISE或RAISE_APPLICATION_ERROR)
    3.异常处理  

    例如:

    DECLARE
      ERROR1 EXCEPTION;
      ERROR2 EXCEPTION;
    BEGIN
      IF 5 = 5 THEN
        RAISE ERROR1;
      ELSIF 5 > 6 THEN
        RAISE ERROR2;
      END IF;
    
    EXCEPTION
      WHEN ERROR1 THEN
        DBMS_OUTPUT.PUT_LINE('5等于5');
      WHEN ERROR2 THEN
        DBMS_OUTPUT.PUT_LINE('5大于5');
    END;

    RAISE 异常名,不仅可以触发自定义的异常,还可以触发系统异常.
    RAISE_APPLICATION_ERROR(error_number,message[,true,false]) 用于抛出一个异常,并给异常赋错误号(缺省为+1),错误信息(缺省为User_Defined_Exception)
    错误号的范围是-20,000到-20,999。错误信息是文本字符串,最多为2048字节。TRUE,则新错误将被添加到已经引发的错误列表中。如果keep_errors=FALSE(缺省),则新错误将替换当前的错误列表。

    RAISE_APPLICATION_ERROR(-20123,'Invald product code',TRUE);

    异常的传播                                                                                                                                 

    PL/SQL程序块的异常部分包含了程序处理错误的代码,当异常被触发时,一个异常陷阱就自动发生,程序控制离开执行部分转入异常处理部分,一旦程序进入异常处理部分就不能再回到同一块的执行部分。下面是异常部分的一般语法:

    EXCEPTION 
      WHEN exception_name THEN 
      Code for handing exception_name 
      [WHEN another_exception THEN 
      Code for handing another_exception] 
      [WHEN others THEN 
      code for handing any other exception.]

     WHEN others THEN 必须放在异常处理的最后面,作为缺省处理没有显示处理的异常,如果当异常发生时,oracle
     没有查找到相应的WHEN ... THEN语句,就会执行THEN之后的代码,如果异常处理代码仅仅只是退出相应的嵌套块,那么
     程序将继续执行内部块END后面的语句,所以存储过程中,如果不想在发生异常后继续向下执行,加上RETURN很有必要,如果在同一块内部没有找到相应的异常,那么将同一块内部的WHEN OTHERS THEN.如果在同一块内也没有WHEN OTHERS THEN,则Oracle会向上一层查找异常处理。如果内层进行了异常处理,则不会再向外层查找异常再次进行处理。

    例如:

    BEGIN
      DECLARE
        DEFINED_EXC EXCEPTION;
      BEGIN
        RAISE DEFINED_EXC;  --触发异常,控制转向; 
      EXCEPTION
        WHEN DEFINED_EXC THEN
          dbms_output.put_line('DEFINED_EXC');
      END;
      --DEFINED_EXC异常处理后,控制转到这里 
    EXCEPTION
      WHEN OTHERS THEN
      --控制不会从DEFINED_EXC异常转到这里,因为内层DEFINED_EXC已被处理 
    END;
  • 相关阅读:
    007 使用SpringMVC开发restful API五--异常处理
    006 使用SpringMVC开发restful API四--用户信息的修复与删除,重在注解的定义
    033 Url中特殊字符的处理
    005 使用SpringMVC开发restful API三--处理创建请求
    004 使用SpringMVC开发restful API二--编写用户详情
    003 使用SpringMVC开发restful API--查询用户
    032 报错
    018 easygui的使用
    017 异常的处理
    012 pandas与matplotlib结合制图
  • 原文地址:https://www.cnblogs.com/jassy/p/4263150.html
Copyright © 2011-2022 走看看