若是未有尤其

Oracle至极分类                                                                                                                        

 Oracle
developer以其神速的多寡处理开发而有名,其卓殊处理机制也是比较完善,不可小视。

  1. Oracle预订义非凡(即已定义的里边分外)
  2. Oracle非预订义非常(即未定义的中间万分)
  3. 用户自定义十分

一、 至极的长处

大规模的预订义分外                                                                                                                    

借使未有尤其,在程序中,应当检查每种命令的中标大概失利,如

NO_DATA_FOUND 语句未有查询出符合条件的笔录重临
TOO_MANY_ROWS 语句符合条件的笔录有多条回来
DUP_VAL_ON_INDEX
数据库表中的某一条有唯一索引,程序试图存款和储蓄四个重复的值
VALUE_ESportageROR在更换字符类型,截取或长度受限爆发非凡,如宣称的尺寸比字符短
STORAGE_E奥迪Q7RORAV肆 内部存款和储蓄器溢出
ZERO_DKugaIVIDE 除数为零
CAST_NOT_FOUND case语句未有相匹配的尺度,同时也尚无else语句
CURSOR_ALREADY_OPEN 程序试图打开三个曾经打开的游标
TIMEOUT_ON_RESOU哈弗CE 系统在守候某一能源,系统超时
ACCESS_INTO_NULL 为对象赋值前必需开首化对象
INVALID_NUMBEEscort 不可能将字符转换到数字
TRANSACTION_BACKED_OUT 由于死锁提交被剥离

BEGIN

周围的非预订义格外                                                                                                                   

SELECT …

尽管要处理未注解的内部十二分,必须采纳OTHERAV4S分外处理器或PRA土霉素A
EXCEPTION_INIT
others
pragma exception_init(exception_name,-Oracle_error_number)

— check for ’no data found’ error

 

SELECT …

用法:

— check for ’no data found’ error

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;

SELECT …

 

— check for ’no data found’ error

ORA-0000一: 违反唯1约束规范 (.) 
ORA-0001七: 请求会话以设置跟踪事件 
ORA-0001八: 超出最大会话数 
ORA-0001玖: 超出最大会话许可数 
ORA-00020: 超出最大进度数 () 
ORA-000贰一: 会话附属于任何或多或少进度;不能够转移会话 
ORA-0002贰: 无效的对话 ID;访问被拒绝 
ORA-000二三: 会话引用进度私用内部存款和储蓄器;不能分开会话 
ORA-000二四: 单壹经过形式下不一致意从多个进度注册 
ORA-0002五: 不恐怕分配  
ORA-000二六: 丢失或无效的对话 ID 
ORA-000贰七: 不或许删去当前会话 
ORA-00028: 您的对话己被删去 
ORA-0002九: 会话不是用户会话 
ORA-00030: 用户会话 ID 不存在。 
ORA-0003壹: 标记要删去的会话 
ORA-0003贰: 无效的对话移植口令 
ORA-0003三: 当前的会话具有空的移植口令 
ORA-00034: 不能够在眼下 PL/SQL 会话中  
ORA-00035: LICENSE_MAX_USEPAJEROS 不能够小于当前用户数 
ORA-0003陆: 当先递归 SQL () 级的最大值 
ORA-000三七: 不能够变换来属于分歧服务器组的会话 
ORA-0003八: 无法创立会话: 服务器组属于其它用户 
ORA-00050: 获取入队时操作系统出错 
ORA-0005①: 等待财富超时 
ORA-00052: 超出最大入队能源数 () 
ORA-000伍叁: 超出最大入队数 
ORA-0005四: 能源正忙,供给钦定 NOWAIT 
ORA-00055: 超出 DML 锁的最大数 
ORA-0005陆: 对象 ‘.’ 上的 DDL 锁以不一样盟格局挂起 
ORA-000⑤七: 超出一时半刻表锁的最大数 
ORA-00058: DB_BLOCK_SIZE 必须为才可设置此数据库 (非 ) 
ORA-00059: 超出 DB_FILES 的最大值 
ORA-00060: 等待能源时检验到死锁 
ORA-000陆一: 另1个例程设置了差别的 DML_LOCKS 
ORA-0006二: 不恐怕赢得 DML 全表锁定;DML_LOCKS 为 0 
ORA-00063: 超出 LOG_FILES 的最大数 
ORA-0006四: 对象过大以至不可能分配在此 O/S (,) 
ORA-00065: FIXED_DATE 的早先化失败 
ORA-00066: LOG_FILES 为  但须要变成  才可包容 
ORA-000陆7: 值  对参数  无效;至少必须为  
ORA-00068: 值  对参数  无效,必须在  和  之间 
ORA-0006九: 不能够赢得锁定 — 禁止使用了表锁定 
ORA-00070: 命令无效 
ORA-0007一: 进程号必须介于 壹 和  之间 
ORA-00072: 进程””不活动 
ORA-0007三: 命令  介于  和  个参数之间时利用 
ORA-0007四: 未钦命进程 
ORA-0007五: 在此例程未找到进度 “” 
ORA-0007陆: 未找到转储  
ORA-00077: 转储  无效 
ORA-0007八: 不可能按名称转储变量 
ORA-0007九: 未找到变量  
ORA-00080: 层次  内定的全局区域无效 
ORA-00081: 地址范围 [,) 不可读 
ORA-000八2:  的内存大小不在有效集合 [1], [2], [4] 之内 
ORA-000八叁: 警告: 或许损坏映射的 SGA  
ORA-0008四: 全局区域必须为 PGA, SGA 或 UGA 
ORA-00085: 当前调用不存在 
ORA-000捌六: 用户调用不存在 
ORA-00087: 命令不可能在长途例程上实行 
ORA-0008八: 共享服务器不可能执行命令 
ORA-0008九: ORADEBUG 命令中没用的例程号 
ORA-00090: 未能将内部存款和储蓄器分配给群集数据库 ORADEBUG 命令 
ORA-00091: LARGE_POOL_SIZE 至少必须为  
ORA-00092: LARGE_POOL_SIZE 必须高于 LAOdysseyGE_POOL_MIN_ALLOC 
ORA-000玖三:  必须介于  和  之间 
ORA-000玖肆:  必要整数值 
ORA-0009陆: 值  对参数  无效,它必须来自  之间 
ORA-000玖7: 使用 Oracle SQL 性格不在 SQL玖2  级中 
ORA-0009玖: 等待能源时产生超时,或然是 PDML 死锁所致 
ORA-00十0: 未找到数据 
ORA-00拾壹: 系统参数 DISPATCHE凯雷德S 的辨证无效 
ORA-00拾二: 调度程序不也许使用互连网协议  
ORA-0010三: 无效的互连网协议;供调度程序备用 
ORA-00十四: 检验到死锁;全部公用服务器已锁定等待能源

那种完结的格局缺点在于错误处理未有与正规处理分开,可读性差,使用尤其,能够便宜处理错误,而且那1个处理程序与平常的工作逻辑分开,进步了可读性,如

 

BEGIN

自定义格外                                                                                                                                 

SELECT …

预约义非常和非预订义分外都与Oracle内部错误有关,并且当现身Oracle错误时会隐含触发相应至极;  
而自定义十分与Oracle错误未有别的涉及,它是由开发职员为一定情景所定义的十三分,需手工业触发。
 步骤
1.概念卓殊
2.触发那么些(RAISE或RAISE_APPLICATION_ERROR)
叁.不胜处理  

SELECT …

例如:

SELECT …

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])
用于抛出三个可怜,并给这一个赋错误号(缺省为+一),错误消息(缺省为User_Defined_Exception)
不当号的界定是-20,000到-20,99玖。错误消息是文本字符串,最多为204八字节。TRUE,则新错误将被添加到已经抓住的不当列表中。要是keep_errors=FALSE(缺省),则新错误将替换当前的百无一用列表。

EXCEPTION

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

WHEN NO_DATA_FOUND THEN — catches all ’no data found’ errors

不行的扩散                                                                                                                                 

2、 非凡的归类

 

有二种档次的不得了,一种为当中国和欧洲常,一种为用户自定义十分,内部非常是实践时期重临到PL/SQL块的ORACLE错误或由PL/SQL代码的某操作引起的不当,如除数为零或内部存款和储蓄器溢出的情事。用户自定义非凡由开发者彰显定义,在PL/SQL块中传递音信以控制对于利用的错误处理。

PL/SQL程序块的不行部分含有了程序处理错误的代码,当十分被触发时,贰个不胜陷阱就机关发出,程控离开执行部分转入分外处理部分,一旦程序进入至极处理部分就不可能再回到同壹块的推行部分。上边是老大多数的相似语法:

每当PL/SQL违背了ORACLE原则或超越了系统依赖的标准就会隐式的发出内部格外。因为每一种ORACLE错误都有贰个数码并且在PL/SQL中13分通过名字处理,ORACLE提供了预约义的中间相当。如SELECT
INTO
语句不重回行时发出的ORACLE卓殊NO_DATA_FOUND。对于预约义相当,现将最常用的越发列举如下:

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.]

exception oracle error sqlcode value condition

 WHEN others THEN
必须放在十三分处理的最后面,作为缺省处理未有体现处理的百般,假诺当非常发生时,oracle
 未有寻找到相应的WHEN …
THEN语句,就会实施THEN之后的代码,假诺那七个处理代码仅仅只是退出相应的嵌套块,那么
 程序将继续执行内部块END后边的话语,所以存款和储蓄进程中,如若不想在发生万分后一而再向下执行,加上RETUKugaN很有必不可缺,尽管在1如既往块内部尚未找到呼应的老大,那么将一律块内部的WHEN
OTHEKugaS THEN.假如在同样块内也不曾WHEN OTHEENCORES
THEN,则Oracle会向上一层查找卓殊处理。要是内层举办了格外处理,则不会再向外围查找极度再一次举办拍卖。

no_data_found ora-0140三 +拾0 select into 语句未有符合条件的记录再次来到

例如:

too_mang_rows ora-0142贰 -142二 select into 语句符合条件的笔录有多条回来

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;

dup_val_on_index ora-00001 -1对于数据库表中的某1列,该列已经被限制为唯一索引,程序试图存款和储蓄多个再一次的值

 

value_error ora-0650贰 -6502在转移字符类型,截取或长度受限时,会发生该越发,如多个字符分配给3个变量,而该变量申明的尺寸比该字符短,就会抓住该尤其

storage_error ora-06500 -6500 内部存款和储蓄器溢出

zero_divide ora-01476 -147陆 除数为零

case_not_found ora-065玖二 -6530
对于选用case语句,未有与之相相称的尺度,同时,也并未有else语句捕获其余的尺码

cursor_already_open ora-0651一 -651一 程序试图打开多个一度打开的游标

timeout_on_resource ora-0005一 -5壹 系统在伺机某壹能源,时间超时

借使要处理未命名的内部十一分,必须选取OTHECRUISERS非凡处理器或PRA氯洁霉素A
EXCEPTION_INIT
。PRAGMA由编写翻译器控制,大概是对于编写翻译器的注释。PRA威他霉素A在编写翻译时处理,而不是在运作时处理。EXCEPTION_INIT告诉编写翻译器将相当名与ORACLE错误码结合起来,那样能够透过名字引用任意的内部相当,并且能够由此名称为那些编写一适合的百般处理器。

在子程序中使用EXCEPTION_INIT的语法如下:

PRAGMA EXCEPTION_INIT(exception_name, -Oracle_error_number);

在该语法中,很是名是宣称的不得了,下例是其用法:

DECLARE

deadlock_detected EXCEPTION;

PRAGMA EXCEPTION_INIT(deadlock_detected, -60);

BEGIN

… — Some operation that causes an ORA-00060 error

EXCEPTION

WHEN deadlock_detected THEN

— handle the error

END;

对于用户自定义相当,只可以在PL/SQL块中的注解部分评释相当,很是的名字由EXCEPTION关键字引进:

reserved_loaned Exception

产生非常后,控制传给了子程序的老超越三分之一,将10分转向各自很是控制块,必须在代码中央银行使如下的构造处理错误:

Exception

When exception1 then

Sequence of statements;

When exception2 then

Sequence of statements;

When others then

3、非常的抛出

由两种办法抛出格外

◆一. 因此PL/SQL运维时斯特林发动机

◆2. 使用RAISE语句

◆3. 调用RAISE_APPLICATION_ETiggoRO中华V存款和储蓄进度

当数据库或PL/SQL在运维时发生错误时,2个百般被PL/SQL运营时引擎自动抛出。非常也可以透过RAISE语句抛出

RAISE exception_name;

显式抛出非凡是程序员处理注脚的可怜的习惯用法,但RAISE不压制表明了的不得了,它能够抛出任何其它特别。例如,你希望用TIMEOUT_ON_RESOU奥迪Q五CE错误质量评定新的周转时丰硕处理器,你只需简单的在程序中央银行使上面包车型大巴语句:

RAISE TIMEOUT_ON_RESOUCE;

譬如上面一个订单输入的例证,若当订单小于库存数据,则抛出尤其,并且捕获该尤其,处理很是

DECLARE

inventory_too_low EXCEPTION;

—其余证明语句

BEGIN

IF order_rec.qty>inventory_rec.qty THEN

RAISE inventory_too_low;

END IF

EXCEPTION

WHEN inventory_too_low THEN

order_rec.staus:=’backordered’;

END;

 

RAISE_APPLICATION_E哈弗RO悍马H2内建函数用于抛出一个卓殊并给这几个赋予三个荒谬号以及错误新闻。自定义13分的缺省错误号是+壹,缺省新闻是User_Defined_Exception。RAISE_APPLICATION_E奥迪Q伍RO奥迪Q7函数可以在pl/sql程序块的进行部分和相当部分调用,显式抛出带特殊错误号的命名极度。
Raise_application_error(error_number,message[,true,false]))

荒唐号的限量是-20,000到-20,99玖。错误音讯是文本字符串,最多为204八字节。TRUE和FALSE表示是增长(TRUE)进错误堆(E汉兰达RO奥迪Q3STACK)依旧覆盖(overwrite)错误堆(FALSE)。缺省情形下是FALSE。

正如代码所示:

IF product_not_found THEN

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

END IF;

4、极度的拍卖

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子串中为每一种分外设计充足处理代码,WHEN
OTHESportageS子串必须放置在结尾面作为缺省处理器处理未有显式处理的不行。当非凡产生时,控制转到极度部分,ORACLE查找当前非凡相应的WHEN..THEN语句,捕捉很是,THEN之后的代码被实施,倘若不当陷阱代码只是脱离相应的嵌套块,那么程序将继续执行内部块END后边的言辞。若是没有找到呼应的特别陷阱,那么将执行WHEN
OTHERS。在10分部分WHEN 子串没有数据限制。

EXCEPTION

WHEN inventory_too_low THEN

order_rec.staus:=’backordered’;

replenish_inventory(inventory_nbr=>

inventory_rec.sku,min_amount=>order_rec.qty-inventory_rec.qty);

WHEN discontinued_item THEN

–code for discontinued_item processing

WHEN zero_divide THEN

–code for zero_divide

WHEN OTHERS THEN

–code for any other exception

END;

当相当抛出后,控制无条件转到十分部分,那就代表控制不可能回到那些产生的职责,当非常被拍卖和缓解后,控制再次来到到上1层执行部分的下一条语句。

BEGIN

DECLARE

bad_credit exception;

BEGIN

RAISE bad_credit;

–爆发卓殊,控制转向;

EXCEPTION

WHEN bad_credit THEN

dbms_output.put_line(‘bad_credit’);

END;

–bad_credit极度处理后,控制转到那里

EXCEPTION

WHEN OTHERS THEN

–控制不会从bad_credit很是转到那里

–因为bad_credit已被处理

END;

当分外发生时,在块的里边尚未该越发处理器时,控制将转到或传播到上一层块的卓殊处理部分。

BEGIN

DECLARE —内部块伊始

bad_credit exception;

BEGIN

RAISE bad_credit;

–产生相当,控制转向;

EXCEPTION

WHEN ZERO_DIVIDE THEN –不可能处理bad_credite异常

dbms_output.put_line(‘divide by zero error’);

END –甘休内部块

–控制不能到达那里,因为11分没有缓解;

–极度部分

EXCEPTION

WHEN OTHERS THEN

–由于bad_credit未有解决,控制将转到那里

END;

5、卓殊的流传

从未拍卖的百般将沿检查实验分外调用程序流传到外面,当相当被处理并缓解或到达程序最外层传播结束。在宣称部分抛出的那多少个将控制转到上一层的要命部分。

BEGIN

executable statements

BEGIN

today DATE:=’SYADATE’; –ERRROR

BEGIN –内部块起头

dbms_output.put_line(‘this line will not execute’);

EXCEPTION

WHEN OTHERS THEN

–分外不会在此地处理

END;–内部块甘休

EXCEPTION

WHEN OTHERS THEN

处理非凡

END

进行部分抛出的老新秀首先传递到同样块的这么些部分,假设在同样块的那么些部分未有拍卖那个足够的微型总结机,那么格外将会传来到上一层的不行部分中,从来到最外层。

      

在卓殊部分抛出的很是将决定转到上壹层的尤其部分。

除此以外错误报告函数SQLCODE和SQLE帕杰罗路虎极光M在OTHEBMWX3S处理器中特意有用,因为它们再次来到ORACLE错误代码和音讯。如下例所示:

declare

err_num NUMBER;

err_msg VARCHAR2(100);

BEGIN

EXCEPTION

WHEN OTHERS THEN

err_num := SQLCODE;

err_msg := SUBSTR(SQLERRM, 1, 100);

INSERT INTO errors VALUES (err_num, err_msg);

END;

 

~~~~有关于格外处理的三个知识点!

 

1.EXCEPTION_INT编写翻译指示

意义是将某命名非常同某一定Oracle错误关联起来.

主用用来捕捉某一定极度错误,而不是由此OTHE路虎极光S来处理.

语法:PROGMA EXCEPTION_INIT(exception_name,oracle_error_number)

 

SQL>

SQL> DECLARE

2 expa EXCEPTION;

3 PRAGMA EXCEPTION_INIT(expa,-6502);

4 vn NUMBER(1);

5 BEGIN

6 vn:=24;

7 EXCEPTION

8 WHEN expa THEN

9 dbms_output.put_line(‘数字或值错误 : 数值精度太高’);

10 WHEN OTHERS THEN

11 dbms_output.put_line(SQLCODE);

12 dbms_output.put_line(substr(SQLERRM,1,100));

13 END;

14 /

数字或值错误 : 数值精度太高

 

PL/SQL procedure successfully completed

 

SQL>

 

2.RAISE_APPLICATION_ERROR

功能用来自定义错误消息

语法:
RAISE_APPLICATION_ERROR(error_number,error_message,[keep_errors])

error_number:-20 000到-20 99玖中间的值

error_message:必须少于512个字符

keep_errors:布尔值.为真则新的荒谬将被加到已存在的荒谬清单中(如若已存在的话),为假(默许值)则新的错误将取而代之当前的错误清单.

 

SQL> BEGIN

2 UPDATE t SET a=’TEST’ WHERE a=’12345′;

3 IF SQL%NOTFOUND THEN

4
raise_application_error(-3000壹,’你傻了?知道未有这么的多寡还去立异!’);

5 END IF;

6 EXCEPTION

7 WHEN OTHERS THEN

8 dbms_output.put_line(substr(SQLERRM,1,100));

9 END;

10 /

ORA-两千1: 你傻了?知道未有这么的数码还去立异!

 

PL/SQL procedure successfully completed

 

SQL>

 

叁.卓殊传播

 

A可实施部分发生的百般

一)如若当前语句块有该越发的处理程序则履行之,控制权交由外层语句块.

 

眼前语句块有该尤其的处理程序:

SQL> DECLARE

2 expa EXCEPTION;

3 expb EXCEPTION;

4 BEGIN

5 BEGIN

6 RAISE expa;

7 EXCEPTION

8 WHEN expa THEN

9 dbms_output.put_line(‘异常A产生’);

10 END;

11 EXCEPTION

12 WHEN expb THEN

13 dbms_output.put_line(‘异常B产生’);

14 END;

15 /

异常A产生

 

PL/SQL procedure successfully completed

 

SQL>

贰)假若当前说话未有该特别的处理程序则经过外层语句块中产生该特别来传播该特别,然后通过外层分外处理程序按步骤1来处理.若外层未有该尤其的处理程序则10分传播到调用环境.

 

脚下语句块未有该特别的处理程序,外层语句块中产生该尤其并拍卖

SQL> DECLARE

2 expa EXCEPTION;

3 expb EXCEPTION;

4 BEGIN

5 BEGIN

6 RAISE expb;

7 EXCEPTION

8 WHEN expa THEN

9 dbms_output.put_line(‘异常A产生’);

10 END;

11 EXCEPTION

12 WHEN expb THEN

13 dbms_output.put_line(‘异常B产生’);

14 END;

15 /

异常B产生

 

PL/SQL procedure successfully completed

 

SQL>

 

方今语句块未有该特别的处理程序,外层语句块中发生该尤其且未有该尤其处理程序,相当传播到调用环境

SQL> DECLARE

2 expa EXCEPTION;

3 expb EXCEPTION;

4 BEGIN

5 BEGIN

6 RAISE expb;

7 EXCEPTION

8 WHEN expa THEN

9 dbms_output.put_line(‘异常A产生’);

10 END;

11 EXCEPTION

12 WHEN expa THEN

13 dbms_output.put_line(‘异常A产生’);

14 END;

15 /

 

DECLARE

expa EXCEPTION;

expb EXCEPTION;

BEGIN

BEGIN

RAISE expb;

EXCEPTION

WHEN expa THEN

dbms_output.put_line(‘异常A产生’);

END;

EXCEPTION

WHEN expa THEN

dbms_output.put_line(‘异常A产生’);

END;

 

ORA-06510: PL/SQL: 无法处理的用户自定义相当事件

ORA-06512: 在line 6

 

SQL>

 

B注脚部分爆发的百般

声称部分某赋值发生相当,该特别被及时传播到外围语句块,之后按"A可实施部分产生的不行"规则来拍卖

 

SQL> BEGIN

2 DECLARE

3 vn NUMBER(1):=25;

4 BEGIN

5 NULL;

6 EXCEPTION

7 WHEN OTHERS THEN

8 dbms_output.put_line(‘极度在内层被拍卖!’);

9 END;

10 EXCEPTION

11 WHEN OTHERS THEN

12 dbms_output.put_line(‘极度在外层被处理!’);

13 END;

14 /

充足在外层被处理!

 

PL/SQL procedure successfully completed

 

SQL>

 

C分外部分发生的丰富

卓殊处理器中也会爆发非常,如RAISE或运营错误发生,那Ritter别立刻被流传到外围同"B注脚部分发生的可怜"

 

例子1

SQL>

SQL> BEGIN

2 DECLARE

3 expa EXCEPTION;

4 expb EXCEPTION;

5 BEGIN

6 RAISE expa;

7 EXCEPTION

8 WHEN expa THEN

9 RAISE expb;

10 WHEN expb THEN

11 –那里即便有expb万分处理语句,不过该尤其会即时传播到外围

12 dbms_output.put_line(‘内层捕捉到万分B’);

13 END;

14 EXCEPTION

15 WHEN OTHERS THEN

16 dbms_output.put_line(‘外层捕捉到至极B’);

17 END;

18 /

外层捕捉到很是B

 

PL/SQL procedure successfully completed

 

SQL>

 

例子2

SQL> desc t;

Name Type


ID NUMBER(1)

 

SQL> BEGIN

2 DECLARE

3 expa EXCEPTION;

4 BEGIN

5 RAISE expa;

6 EXCEPTION

7 WHEN expa THEN

8 INSERT INTO t VALUES(12);

9 WHEN OTHERS THEN

10 dbms_output.put_line(‘内层捕捉到很是’);

11 END;

12 EXCEPTION

13 WHEN OTHERS THEN

14 dbms_output.put_line(‘外层捕捉到极度’);

15 END;

16 /

外层捕捉到非常

 

PL/SQL procedure successfully completed

SQL>

 

2007-5-7 19:10:25 一、在plsql中,oracle自带的Exceptions如下:

Exception Oracle Error SQLCODE Value

ACCESS_INTO_NULL ORA-06530 -6530

CASE_NOT_FOUND ORA-06592 -6592

COLLECTION_IS_NULL ORA-06531 -6531

CURSOR_ALREADY_OPEN ORA-06511 -6511

DUP_VAL_ON_INDEX ORA-00001 -1

INVALID_CURSOR ORA-01001 -1001

INVALID_NUMBER ORA-01722 -1722

LOGIN_DENIED ORA-01017 -1017

NO_DATA_FOUND ORA-01403 +100

NOT_LOGGED_ON ORA-01012 -1012

PROGRAM_ERROR ORA-06501 -6501

ROWTYPE_MISMATCH ORA-06504 -6504

SELF_IS_NULL ORA-30625 -30625

STORAGE_ERROR ORA-06500 -6500

SUBSCRIPT_BEYOND_COUNT ORA-06533 -6533

SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 -6532

SYS_INVALID_ROWID ORA-01410 -1410

TIMEOUT_ON_RESOURCE ORA-00051 -51

TOO_MANY_ROWS ORA-01422 -1422

VALUE_ERROR ORA-06502 -6502

ZERO_DIVIDE ORA-01476 -1476

 

2007-5-7 21:45:42 Oracle SQLCODE/SQLERRM

Oracle内置函数SQLCODE和SQLE卡宴奥迪Q伍M是特意用在OTHE宝马X3S处理器中,分别用来回到Oracle的错误代码和谬误音讯。

OTHE奥迪Q7S处理器应该是老大处理块中的最终的那多少个处理器,因为它是用来捕获除了别的相当处理器处理以外的有所的Oracle卓殊,所以在先后的最外层使用二个OTHESportageS处理器的话,将可以保证全部的一无所能都会被检验到。

 

在一个内在的不胜中,SQLCODE再次回到Oracle错误的序号,而SQLEENVISIONRubiconM再次回到的是对应的错误消息,错误消息首先显示的是错误代码。SQLCODE重临的是负数,除非Oracle的失实为“ORA-0140三:NO
DATA FOUND”(译:ORA-0140三:未找到数据),当Oracle错误为“ORA-01403:NO
DATA
FOUND”时,其相应的SQLCODE为+100。对于用户自定义的不行,SQLCODE重返的是+一,而SQLELacrosse奥迪Q3M重临的是User-Defined
Exception。

 

多少个Oracle的荒唐音讯最多只能分包511个字节的错误代码。即使没有非凡被触发,则SQLCODE重返0,SQLE瑞虎牧马人M重返“ORA-0000:normal,
successful completion”。

相关文章