葡京会Oracle异常。Oracle基础 PL-SQL编程基础(4) 异常处理。

Oracle异常分类                                                                                                                        

十分处理:

  1. Oracle预定义异常(即已定义的其中非常)
  2. Oracle非预定义异常(即不定义的里边非常)
  3. 用户从定义格外

纵使可以的PL-SQL程序也会见逢错误或不料想的轩然大波,一个优之程序还该能够处理各种离谱情况,尽可能的打错误受还原。程序在运行时出现的失实成为好。发生甚后,语句讲终止执行,PLSQL会立即以控制权交给PLSQL异常处理局部。Oracle中使用EXCEPTION来拍卖非常,一般有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 由于死锁提交给剥离

    1. 预定义 ( Predefined )错误

大面积的非预定义异常                                                                                                                   

 
 ORACLE预定义的异常情况大约产生24个。对这种异常情况的拍卖,无需在先后中定义,由ORACLE自动将那抓住。

倘只要处理不声明的中非常,必须采用OTHERS异常处理器或PRAGMA
EXCEPTION_INIT
others
pragma exception_init(exception_name,-Oracle_error_number)

    2. 非预定义 ( Predefined )错误

 

  
即其他标准的ORACLE错误。对这种异常情况的处理,需要用户以先后中定义,然后由ORACLE自动将该诱惑。

用法:

    3. 用户定义(User_define) 错误

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: 检测到死锁;全部公用服务器已锁定等待资源

十分处理部分一般在 PL/SQL 程序体的后半部:

 

语法:

自打定义格外                                                                                                                                 

EXCEPTION
   WHEN first_exception THEN  第一个非常处理的代码;
   WHEN second_exception THEN  第二只特别处理的代码
   WHEN OTHERS THEN  其他大处理的代码
END;

预定义异常及免预定义异常且同Oracle内部错误有关,并且当出现Oracle错误时会见含有触发相应异常;  
苟于定义格外和Oracle错误没有外关联,它是出于开发人员为一定情景所定义的要命,需手工触发。
 步骤
1.概念格外
2.碰发好(RAISE或RAISE_APPLICATION_ERROR)
3.怪处理  

 

例如:

1、预定义错误:

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;

  由Oracle预先定义好之挺,Oracle中预定义的好大约发生24独。如下表所示。

RAISE 异常名,不仅可触发自定义之深,还得接触发系统异常.
RAISE_APPLICATION_ERROR(error_number,message[,true,false])
用于抛来一个十分,并被那个赋错误号(缺省呢+1),错误信息(缺省吧User_Defined_Exception)
荒唐号的范围是-20,000顶-20,999。错误信息是文本字符串,最多吗2048字节。TRUE,则新错误将受上加到已经引发的一无是处列表中。如果keep_errors=FALSE(缺省),则新错误将替换当前之错列表。

错误号

异常错误信息名称

说明

ORA-0001

Dup_val_on_index

违反了唯一性限制

ORA-0051

Timeout-on-resource

在等待资源时发生超时

ORA-0061

Transaction-backed-out

由于发生死锁事务被撤消

ORA-1001

Invalid-CURSOR

试图使用一个无效的游标

ORA-1012

Not-logged-on

没有连接到ORACLE

ORA-1017

Login-denied

无效的用户名/口令

ORA-1403

No_data_found

SELECT INTO没有找到数据

ORA-1422

Too_many_rows

SELECT INTO 返回多行

ORA-1476

Zero-divide

试图被零除

ORA-1722

Invalid-NUMBER

转换一个数字失败

ORA-6500

Storage-error

内存不够引发的内部错误

ORA-6501

Program-error

内部错误

ORA-6502

Value-error

转换或截断错误

ORA-6504

Rowtype-mismatch

宿主游标变量与 PL/SQL变量有不兼容行类型

ORA-6511

CURSOR-already-OPEN

试图打开一个已处于打开状态的游标

ORA-6530

Access-INTO-null

试图为null 对象的属性赋值

ORA-6531

Collection-is-null

试图将Exists 以外的集合( collection)方法应用于一个null pl/sql 表上或varray上

ORA-6532

Subscript-outside-limit

对嵌套或varray索引得引用超出声明范围以外

ORA-6533

Subscript-beyond-count

对嵌套或varray 索引得引用大于集合中元素的个数.

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

留神:预定义异常,首先是反其道而行之了
Oracle的正规,其次Oracle只也那20基本上个要命取了名字,如错误号”ORA-01043不找到数据”被取名也”NO_DATA_FOUND”,这样在PLSQL中使用NO_DATA_FOUND来捕获处理便可了。

老大的不胫而走                                                                                                                                 

示例:

 

DECLARE
  V_ID NUMBER;
BEGIN
    SELECT ID INTO v_id FROM es_user WHERE 1=0; 
    DBMS_OUTPUT.put_line(v_id);
    EXCEPTION
      WHEN too_many_rows THEN
           DBMS_OUTPUT.put_line('无法将查询的多个值赋给变量');
      WHEN no_data_found THEN
           DBMS_OUTPUT.put_line('无法将空值付给变量');
      WHEN OTHERS THEN
           DBMS_OUTPUT.put_line('其他异常');
END; 

PL/SQL程序块的深部分含有了程序处理错误的代码,当好被点时,一个不胜陷阱就自行出,程序控制离开执行有转入异常处理局部,一旦程序上大处理部分即无克重新回同一块的实施有。下面是殊部分的相似语法:

苟查询语句返回多独结果,则会too_many_rows中的非常处理代码,如果无价值返回,则执行no_data_found异常处理的代码。如果有其他左,则行others中之不胜处理代码

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会向达一致重合查找异常处理。如果内层进行了很处理,则不见面又朝着外围查找异常再次展开拍卖。

2、非预定义错误

例如:

匪预定义异常指任何专业的Oracle错误,对于这话总好处理的状,需要用户以先后中定义,然后由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;

对此这看似非常处理,首先必须对非定义的Oracle异常进行定义。步骤如下:

 

  (1)在PLSQL声明部分概念异常情况。

DECLARE
  FK_EXCEPTION EXCEPTION;  --定义一个异常

  (2)将那个定义好之很及正规的Oracle异常联系起来,使用EXCEPTION_INIT语句:

  PRAGMA EXCEPTION_INIT(FK_EXCEPTION,-2291);  --2291为Oracle定义的错误号,也就是违反了外键约束

  (3)在PLSQL中的老处理部分对怪做出相应的处理。(完整代码)

DECLARE
  FK_EXCEPTION EXCEPTION;
    PRAGMA EXCEPTION_INIT(FK_EXCEPTION,-2291);     --2291为Oracle定义的错误号,也就是违反了外键约束
BEGIN
    UPDATE ES_ORDER SET user_id = 100 WHERE ID=1;  --修改用户的ID为一个不存在的值,则会引发异常。
    EXCEPTION
        WHEN fk_exception THEN
            DBMS_OUTPUT.put_line('该用户不存在');
END;

  非预定义异常以及预定义异常一样,也是违反了Oracle的正统,但Oracle没有也这种好取名字,如错误号”ORA-2291″,没有名字,这样在PLSQL块的杀部分无法拨货,所以要是先行定义格外变量。

3、用户从定义错误

程序执行过程遭到,出现了编程人员认为的不规则情况,对于这种异常情况,需要用户以次中定义格外,然后显示的在程序中拿那印发。用户从定义格外通过raise语词来点。当引发这很,程序会专项EXCEPTION快处理非常。

对于这种异常处理,步骤如下:

  (1)在宣称部分声明异常

DECLARE
  AGE_EXCEPTION EXCEPTION;  --声明一个异常

  (2)抛来特别信息

IF v_age < 0 OR v_age > 100 THEN
        RAISE age_exception;
END IF;

  (3)在PLSQL异常处理局部对异常情况作出相应的拍卖。

EXCEPTION
    WHEN age_exception THEN
        DBMS_OUTPUT.put_line('年龄只能在0-100之间!');

以身作则:(判断年龄是否以0-100之间)

DECLARE
  V_AGE NUMBER := &AGE;
  AGE_EXCEPTION EXCEPTION;
BEGIN
    IF v_age < 0 OR v_age > 100 THEN
        RAISE age_exception;
    END IF;
    EXCEPTION
        WHEN age_exception THEN
            DBMS_OUTPUT.put_line('年龄只能在0-100之间!');
END;

 

异常存储过程:

而外以上3种特别处理,RAISE_APPLICATION_ERROR存储过程,可以更定义格外错误信息,它呢应用程序提供了同样栽及Oracle交互的点子。

语法:

  RAISE_APPLICATION_ERROR(error_number,error_message);

  error_number:表示用户为那个指定的号码,该号码必须是在-20000~-20999之间的负整数。

  error_message:表示用户为挺指定的信息文本。消息长度可长达到2048字节,错误信息是和error_number关联的公文。

 

相关文章

admin

网站地图xml地图