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;
时间: 2024-10-21 22:07:28

Oracle知识分类之异常的相关文章

Oracle知识分类之常见规范

命名规范 变量规范 1.入参,统一以I_前缀开头,且不能省略IN 2.出参,统一以O_前缀开头 3.局部变量,统一以V_前缀开头 4.常量,统一以CN_前缀开头 5.游标,统一以CUR_前缀开头 组成规范 数据库中的各个名称必须以字母开头,含字母.数字.下划线,严禁以SYS开头,语义需明确. 长度规范 表名.字段名.过程名.方法名.触发器名.序列名,同义词名.视图名.等Oralce对象标识符长度不能超过30个字符 游标规范 1.如果要查询的数据为一列表,需要将游标作为返回参数 2.在打开游标前,

Oracle知识整理

1.自带三种登录方式: Scott/tiger   sys/manager   system/manager 2.基本的操作 1)  建数据库 create tablespace 表空间的名称 datafile ‘路径+文件.dbf’ size 初始大小m autoextend on    --是否为自动增长 eg: create tablespace myspace datafile 'e:\a.dbf' size 5m autoextend on 2)建用户 create  user 用户名

Atitit 个人信息数据文档知识分类

1.1. 知识分类法,参照图书分类法 1 2. Attilax知识分类 2 2.1. 公共文档(一般技术资料,通过标题可以网上搜索到的) 2 2.2. sum  Ati sum doc 2 2.3. sum  Ati doc mini 2 2.4. Sum Pic info 2 2.5. Music 2 2.6. v 2 2.7. Foto ppl 人物摄影 3 2.8. Foto pose  拍摄姿势摄影 3 2.9. Isho 衣物摄影 3 2.10. Isho hot 3 2.11. Wr

oracle 知识

1.查询索引数量 select table_name, count(*) cnt from user_indexes where index_type='NORMAL' group by table_namehaving count(*) >= 1order by cnt desc ; 2.查询外键未建建索引的情况. select table_name, constraint_name, cname1 || nvl2(cname2, ',' || cname2, null) || nvl2(cn

知识分类——实事求是

把握住基本的方向,做好自己,反省自己,不断学习.不断反省. 但是还要具体情况,具体对待.生活中的情况,总是各种各样的.这就涉及到知识分类. 知识分为自然科学.社会科学.自然科学,简单地说,就是一门干活的手艺.社会科学是人与人的竞争.相处之道.而哲学,是对社会科学.自然科学的概括和总结,思维的方法.步骤,比较宏观.因为无论是自然科学.社会科学,进行学习和实践的时候,都涉及到相应的方法. 要想生存,要想做事行得通,就必须要学习自然科学.社会科学,还有形成自己的方法和思维--这就是哲学.而一直所学习的

oracle中的预定异常和自定义异常

预定异常 oracle中的预定异常情况大约有24个,对于这种异常情况的处理,无须再程序中定义,可用oracle自动引发,常见的预定异常如下 异常 说明 ACCESS_INTO_NULL 在未初始化对象时出现 CASE_NOT_FOUND CASE语句中的选项与用户输入的数据不匹配时出现 COLLECTION_IS_NULL 给尚未初始化的表或数组赋值时出现 CURSOR_ALREADY_OPEN 在用户试图重新打开已经打开的游标时出现.在重新打开游标前必须先将其关闭 DUP_VAL_ON_IND

PLSQL_Oracle Exception异常分类、异常抛出、异常处理、异常传播(概念)

2014-06-03 BaoXinjian 一.摘要 在PLSQL程序开发过程中,很重要的部分就是对程序异常的监控和处理,包括如何触发异常,何时进行处理,如何进行处理,是否将程式中的所有异常集中在一起,通过公共异常处理的procedure或function,如果没有完善的程式处理机制,很难说该程式是一只健壮的程式,当程式遇到很多类型或者量很多资料时,系统若没有异常处理必然会导致程式的出错 当预判到了某些异常,需要对预判到的异常进行合适相应的处理,是否抛出异常还是忽略还是其他 当然程式没有预判到或

第十九节(异常的基本概念, 异常的分类, 异常的捕获和处理,自定义异常,方法覆盖与异常)

1: Java 异常处理 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 异常发生的原因有很多,通常包含以下几大类: 1. 用户输入了非法数据. 2. 要打开的文件不存在. 网络通信时连接中断,或者JVM内存溢出.这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的. 要理解Java异常处理是如何工作的,要掌握以下三种类型的异常: 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的.例如要打开一个不

Oracle断电后重启异常

这是我的第一篇博客~ 2017-06-23,我所在的项目现成由于机房断电,导致项目所在的一台数据库服务器挂掉了.早上重启后发现切换Oracle用户异常,显示这个界面 初步分析是:用户还在,但是挂载有问题. 于是开始调整挂载: vim /etc/mtab 增加/dev/sda3 /media/CRM ext4 rw 0 0 vim /etc/fstab 增加/dev/sda3 /media/CRM ext4 defaults 0 0 至于这两个挂载文件的作用和关系 ------一无所知