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;

 

相关文章