Oracle-存储过程exception异常处理大全及实例_第1页
Oracle-存储过程exception异常处理大全及实例_第2页
Oracle-存储过程exception异常处理大全及实例_第3页
Oracle-存储过程exception异常处理大全及实例_第4页
Oracle-存储过程exception异常处理大全及实例_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一、一个实例

Commit;

createorreplaceprocedurePROC_SUNHONGBO_MONCHNL(timvarchar2)is

timestvarchar(8);

timdayvarchar(33);

sqlsqlvarchar(6666);

no_resultEXCEPTION;

begin

Commit;

selectto_char(sysdate;yyyymmddHH24miss,)timaintotimdayfromdual;

selectto_char(add_months(sysdate,-l),'yyyymm')monintotimestfromdual;

selecttimmonintotimestfromdual;

executeimmediate'deletereport.wo_sunhongbo_chnlwheremon='||tim;

Commit;

1*1、添加所需要的列real_charge+time,如果有就抛出异常后继续执行**********/

BEGIN

executeimmediate'altertableshiywll.t_myaddreal_charge'||tim||1varchar2(GG),;

EXCEPTION

WHENno_resultTHEN

DBMS_OUTPUT.PUT_LINE('你的数据更新语句失败了!);

WHENOTHERSTHEN

DBMSJDUTPUT.PUTJJNEC你的数据更新语句!已经存在该列1:,||tim);

END;

executeimmediate'updateshiywll.t_mysetreal_charge'||tim11'=null,;

Commit;

Commit;

dbms_output.put_line('timest:|||timest||';tim:|||tim||';timest:|||sqlsql);

Commit;

endPROC_SUNHONGBO_MONCHNL;

Commit;

主要内容如F:

1.1异常处理概念

1.1.1预定义的异常处理

1.1.2非预定义的异常处理

1.1.3用户自定义的异常处理

1.1.4用户定义的异常处理

1.2异常错误传播

1.2.1在执行部分引发异常错误

1.2.2在声明部分引发异常错误

1.3异常错误处理编程

1.4在PL/SQL中使用SQLCODE,SQLERRM异常处理函数

即使是写得最好的PL/SQL程序也会遇到错误或未预料到的事件。一个优秀的程序都应该

能够正确处理各种出错情况,并尽可能从错误中恢复。任何ORACLE错误(报告为

ORA-xxxxx形式的Oracle错误号)、PL/SQL运行错误或用户定义条件(不一写是错误),

都可以。当然了,PL/SQL编译错误不能通过PL/SQL异常处理来处理,因为这些错误发生

在PL/SQL程序执行之前,

ORACLE提供异常情况(EXCEPTION)和异常处理(EXCEPTIONHANDLER)来实现错误处

理。

1-1异常处理概念

异常情况处理(EXCEPTION)是用来处理正常执行过程中未预料的事件,程序块的异常处理

预定义的错误和自定义错误,由于PL/SQL程序块一旦产生异常而没有指出如何处理吐程序

就会自动终止整个程序运行.

有三种类型的异常错误:

1.预定义(Predefined)错误

ORACLE预定义的异常情况大约有24个。对这种异常情况的处理,无需在程序中定义,

由ORACLE自动将其引发。

2.非预定义(Predefined)错误

即其他标准的ORACLE错误。对这种异常情况的处理,需要用户在程序中定义,然后由

ORACLE自动将其引发。

3.用户定义(User_define)错误

程序执行过程中,出现编程人员认为的非正常情况。对这种异常情况的处理,需要用户在

程序中定义,然后显式地在程序中将其引发。

异常处理部分•般放在PL/SQL程序体的后半部,结构为

EXCEPTION

WHENfirst_exceptionTHEN<codetohandlefirstexception>

WHENsecond_exceptionTHEN〈codetohandlesecondexception>

WHENOTHERSTHEN<codetohandleothersexception>

END;

异常处理可以按任意次序排列,但OTHERS必须放在最后.

1.1.1预定义的异常处理

预定义说明的部分ORACLE异常错误

错误号异常错误信息名称说明

ORA-0001Dup_val_on_index违反了唯一性限制

ORA-0051Timeout-on-resource在等待资源时发生超时

ORA-0061Transaction-backed-out由于发生死锁事务被撤消

ORA-1001Invalid-CURSOR试图使用一个无效的游标

ORA-1012Not-logged-on没有连接到ORACLE

ORA-1017Login-denied无效的用户名/口令

ORA-1403No_data_foundSELECTINTO没有找到数据

ORA-1422Too_mary_rowsSELECTIFJTO返回多行

ORA-1476Zero-divide试图被零除

ORA-1722Invalid-NUMBER转换一个数字失败

ORA-6500Storage-error内存不够引发的内部错误

ORA-6501Program-error内部错误

ORA-6502Value-error转换或截断错误

ORA-6504Rowtype-mismatch宿主游标变量号PL/SQL变量有不兼容行类型

ORA-6511CURSOR-already-OPEN试图打开一个已处于打开状态的游标

ORA-6530Access-INTO-null试图为null对象的属性赋值

ORA-6531Collection-is-null试图将Exists以外的集合(collection)方法应用于一

个nullpl/sql表上或varray上

ORA-6532Subscript-outside-limit对嵌套或vanray索引得引用超出声明范围以外

ORA-6533Subscript-beyond-count对嵌套或varray索引得引用大丁•集合中元素的个数.

对这种异常情况的处理,只需在PL/SQL块的异常处理部分,直接引用相应的异常情况名,

并对其完成相应的异常错误处理即可。

例1:更新指定员工工资,如工资小于1500,则加100;

DECLARE

v_empnoemployees.employee_id%TYPE:=Sempno;

v_salemployees.salary%TYPE;

BEGIN

SELECTsalaryINTOv_salFROMemployeesWHER3employee_id=v_empno;

IFv_sal<=1500THEN

UPDATEemployeesSETsalary=salary+LOOWHEREemployee_id=v_err1pno;

DBMS_OUTPUT.PUT_L工编码为」Iv_empno||,员工工资已更新!,);

ELSE

DRMS_OUTPUT.PUT_L工NEL编码为,||vampnol|,员工工资已经超过规定值”);

ENDIF;

EXCEPTION

WHENNO_DATA_FOUNDTHEN

DBMS_OUTPUT.PUT_L:CNE(,数据库中没有编码为,|Iv_empnoII'的员工');

WHENTOO_MANY_ROWSTHEN

DBMS_OUTPUT.PUT_LINE(,程序运行错误!请使用游标1);

WHENOTHERSTHEN

DBMS_OUTPUT.PUT_LINE(SQLCODE||'——1||SQLERRM);

END;

1.1.2非预定义的异常处理

对•于这类异常情况的处理,首先必须对非定义的ORACLE错误进行定义。步骤如下:

1.在PL/SQL块的定义部分定义异常情况:

〈异常情况〉EXCEPTION;

2.将其定义好的异常情况,与标准的ORACLE错误联系起来,使用EXCEPTIONJNIT语

句:

PRAGMAEXCEPTIONINITY异常情况〉,(错误代码>);

3.在PL/SQL块的异常情况处理部分对异常情况做出相应的处理。

例2:删除指定部门的记录信息,以确保该部门没有员二。

11

INSERTINTOdepartmentsVALUES(50,'FINANCEz,CHICAGO);

DECLARE

v_deptnodepartments.department_id%TYPE:=&deptno;

deptno_remainingEXCEPTION;

PRAGMAEXCEPTION_INIT(deptno_remaining,-2292);

/*-2292是违反一致性约束的错误代码*/

BEGIN

DELETEFROMdepartmentsWHEREdepartment_id=v_deptno;

EXCEPTION

WHENdeptno_remainingTHEN

DBMS_OUTPUT.PUT_LINE('违反数据完整性约束!1);

WHENOTHERSTHEN

DBMS_OUTPUT.PUT_LINE(SQLCODEII'——1I|SQLERRM);

END;

1.L3用户自定义的异常处理

当与一个异常错误相关的错误出现时,就会隐含触发该异常错误。用户定义的异常错误是通

过显式使用RAISE语句来触发。当引发一个异常错误时,控制就转向到EXCEPTION块

异常错误部分,执行错误处理代码。

对于这类异常情况的处理,步骤如下:

1.在PL/SQL块的定义部分定义异常情况:

〈异常情况》EXCEPTION;

2.RAISEv异常情况》:

3.在PL/SQL块的异常情况处理部分对异常情况做出用应的处理。

例3:更新指定员工工资,增加100;

DECLARE

v_empnoemployees.employee_id%TYPE:=&empno;

no_resultEXCEPTION;

BEGIN

UPDATEemployeesSETsalary=salary+100WHEREemployee_id=v_empno;

IFSQL告NOTFOUNDTHEN

RAISEno_result;

ENDIF;

EXCEPTION

WHENno_resultTHEN

DBMS_OUTPUT.PUT_L:INE「你的数据更新语句失败了”);

WHENOTHERSTHEN

DBMS_OUTPUT.PUT_LINE(SQLCODEII'——'IISQLERRM);

END;

1.1.4用户定义的异常处理

调用DBMS_STANDARD(ORACLE提供的包)包所定义的RAISE_APPLICATION_ERROR

过程,可以重新定义异常错误消息,它为应用程序提供了一种与ORACLE交互的方法。

RAISE_APPLICATION_ERROR的语法如下:

RAISE_APPLICATION_ERROR(error_numberrerror_message,[keep_errors]);

这里的error_number是从一20,000至i]-20,999之间的参数,

error_message是柱应的提示信息(<2048字节),

keep_errors为可选,如果keep_errors二TRUE,则新错误将被添力【倒已经弓I发的错

误列表中。如果keep_er「o「s二FALSE(缺省),则新错误将替换当前的错误列表。

例4:创建一个函数get_salary,该函数检索指定部门的工资总和,其中定义了-20991和

-20992号错误,分别处理参数为空和非法部门代码两种错误:

CREATETABLEerrlog(

ErrcodeNUMBER,

ErrtextCHAR(40));

CREATEORREPLACEFUNCTIONget_salary(p_deptnoNUMBER)

RETURNNUMBER

AS

vsalNUMBER;

BEGIN

IFp_deptnoISNULLTHEN

RAISE_APPLICATION_ERROR(-20991,'部门彳弋码为空,);

ELSIFp_deptno<0THEN

RAISE_APPLICATION_ERROR(20992,,无效的部门代码

ELSE

SELECTSUM(employees.salary)INTOv_salFROMemployees

WHEREemployees.department_id=p_deptno;

RETURNv_sal;

ENDIF;

END;

DECLARE

v_salaryNUMBER(7Z2);

V_sqlcodeNUMBER;

V_sqlerrVARCHAR2(512);

Null_deptnoEXCEPTION;

Invalid_deptnoEXCEPTION;

PRAGMAEXCEPTION_INIT(null_deptnoz-20991);

PRAGMAEXCEPTION_INIT(invalid_deptnoz-20992);

BEGIN

V_salary:=get_salary(10);

DBMSOUTPUT.PUTLINEr10号部门工资:'IITOCHAR(V_salary));

BEGIN

V_salary:=get_salary(-10);

EXCEPTION

WHENinvalid_deptnoTHEN

V_sqlcode:=SQLCODE;

V_sqlerr:=SQLERRM;

INSERTINTOerrlog(errcode,errtext)

VALUES(v_sqlcode,v_sqlerr);

COMMIT;

ENDinnerl;

V_salary:=get_salary(20);

DBMS_OUTPUT.PUT_LINE(1部门号为20的工资为:'IITO_CHAR(V_salary));

BEGIN

V_sa1ary:=gAt._5;a1ary(NUT.T.);

ENDinner2;

V_salary:=get_salary(30);

DBMS_OUTPUT.PUT_LINE(1部门号为30的工资为:'IITO_CHAR(Vsalary));

EXCEPTION

WHENnull_deptnoTHEN

V_sqlcode:=SQLCODE;

Vsqlerr:-SQLERRM;

INSERTINTOerrlog(errcode,errtext)VALUES(v_sqlcodezv_sqlerr);

COMMIT;

WHENOTHERSTHEN

DBMS_OUTPUT.PUT_LINE(SQLCODE||'——|||SQLERRM);

ENDouter;

例5:定义触发器,使用RAISE_APPLICATION_ERROR阻止没有员工姓名的新员式记

录插入:

CREATEORREPLACETRIGGERtr_insert_emp

BEFOREINSERTONemployees

FOREACHROW

BEGIN

IF:new.first_nameISNULLOR:new.last_nameisnullTHEN

RAISE_APPLICATION_ERROR(-20000,1Employeemusthaveaname.');

ENDIF;

END;

1.2异常错误传播

由于异常错误可以在声明部分和执行部分以及异常错误部分出现,因而在不同部分引发

的异常错误也不一样。

1.2.1在执行部分引发异常错误

当一个异常错误在执行部分引发时,有下列情况:

I如果当前块对该异常错误设置了处理」则执行它并成功完成该块的执行,然后控制转给包

含块。

I如果没有对当前块异常错误设置定义处理器,则通过在包含块中引发它来传播异常错误。

然后对该包含块执行步骤1)。

1.2.2在声明部分引发异常错误

如果在声明部分引起异常情况,即在声明部分出现错误,那么该错误就能影响到其它的

块。比如在有如下的PL/SQL程序:

©

DECLARE

namevarchar2(12):=*EricHu';

其它语句

BEGIN

其它语句

EXCEPTION

WHENOTHERSTHEN

其它语句

END;

例子中,由于Abcrumber(3)='abc';出错,尽管在EXCEPTION中说明了

WHENOTHERSTHEN语句,但WHENOTHERSTHEN也不会被执行。但是如果在该

错误语句块的外部有一个异常错误,则该错误能被抓住,如:

BEGIN

DECLARE

namevarchar2(12):=1EricHu';

其它语句

BEGIN

其它语句

EXCEPTION

WHENOTHERSTHEN

其它语句

END;

EXCEPTION

WHENOTHERSTHEN

其它语句

END;

1-3异常错误处理编程

在一般的应用处理中,建议程序人员要用异常处理,因为如果程序中不声明任何异常处

理,则在程序运行出错时,程序就被终止,并且也不提示任何信息。下面是使用系统提供的

异常来编程的例子。

1.4在PL/SQL中使用SQLCODE,SQLERRM异常处理函数

由于ORACLE的错信息最大长度是512字节,为了得到完整的错误提示信息,我;门可

用SQLERRM和SUBSTR函数一起得到错误提示信息,方便进行错误,特别是如果

WHENOTHERS异常处理器时更为方便。

SQLCODE返回遇到的Oracle错误号,

SQLERRM返回遇到的Oracle错误信息.

如:SQLCODE=-100eSQLERRM=,no_data_found'

SQLCODE=0eSQLERRM='normal,successfualcompletion'

例6,将ORACLE错误代码及其信息存入错误代码表

CREATETABLEerrors(errnumNUMBER(4)zerrmsgVARCHAR2(100));

DECLARE

err_msgVARCHAR2(100);

BEGIN

/*得到所有ORACLE错误信息*/

FORerr_numIN-100..0LOOP

err_msg:=SQLERRM(err_num);

TNSF.RTTNTOarrcrsVAT.OES(Arr_numzprr_msg);

ENDLOOP;

END;

DROPTABLEerrors;

例7.查询ORACLE错误代码;

BEGIN

INSERTINTOemployees(employee_id,firstname,lastname,hiredate,departm

ent_id)

VALUES(2222,'Eric'z1Hu',SYSDATE,20);

DBMS_OUTPUT.PUT_LINE('插入数据记泉成功!,);

INSERTINTOemployees(employee_id,firstname,lastname,hiredate,departm

ent_id)

VALUES(2222,,胡'J勇',SYSDATE,20);

DBMS_OUTPUT.PUT_LINE(1插入数据记录成功广);

EXCEPTION

WHENOTHERSTHEN

DBMS_OUTPUT.PUT_LINE(SQLCODE||'——'||SQLERRM);

END;

A

例8.利用ORACLE错误代码,编写异常错误处理代码;

DECLARE

empno_remainingEXCEPTION;

PRAGMAEXCEPTION_INIT(empno_remainingz-1);

/*-1是违反唯一约束条件的错误代码*/

BEGIN

INSERTINTOemployees(employeeid,firstname,lastname,hiredate,departm

ent_id)

1

VALUES(3333z'Eric',Hu',SYSDATE,20);

DBMS_OUTPUT.PUT_LINE(,插入数据记录成功!,);

INSERTINTOemployees(employee_id,firstname,lastname,hiredate,departm

ent_id)

VALUES(3333,'胡','勇',SYSDATE,20);

DBMS_OUTPUT.PUT_LINE(•插入数据记录成功!,);

EXCEPTION

WHENempno_remainingTHEN

DBMS_OUTPUT.PUT_L3:NE(,违反数据完整性约束!,);

WHENOTHERSTHEN

DBMS_OUTPUT.PUT_LINE(SQLCODEI|'——'||SQLERRM);

END;

Oracle存储过程异常处理

1、异常的优点

如果没有异常,在程序中,应当检查每个命令的成功还是失败,如

BEGIN

SELECT...

-checkfor*nodatafound5error

SELECT...

--checkfor!nodatafound,error

SELECT...

-checkfor'nodatafound,error

这种实现的方法缺点在于错误处理没有与正常处理分开,可读性

差,使用异常,可以方便处理错误,而且异常处理程序与正常的事务逻

辑分开,提高了可读性,如

BEGIN

SELECT...

SELECT...

SELECT...

EXCEPTION

WHENNO_DATA_FOUNDTHEN-catchesall'nodatafound,

errors

2、异常的分类

有两种类型的异常,--种为内部异常,一种为用户自定义异常,内

部异常是执行期间返回到PL/SQL块的ORACLE错误或由PL/SQL代

码的某操作引起的错误,如除数为零或内存溢出的情况。用户自定义异

常由开发者显示定义,在PL/SQL块中传递信息以控制对于应用的错误

处理。

每当PL/SQL违背了ORACLE原则或超越了系统依赖的原则就会

隐式的产生内部异常。因为每个ORACLE错误都有一个号码并且在

PL/SQL中异常通过名字处理,ORACLE提供了预定义的内部异常.如

SELECTINTO语句不返回行时产生的ORACLE异常

NO_DATA_FOUNDo对于预定义异常,现将最常用的异常列举如不:

exceptionoracleerrorsqlcodevaluecondition

no_data_foundora-01403+100

selectinto语句没有符合条件的记录返回

too_many_rowsora-01422-1422selectinto语句符合条

件的记录有多条返回

dup_val_on_indexora-00001-1对于数据库表中的某一

列,该列己经被限制为唯一索引,程序试图存储两个重复的值

value_errorora-06502-6502在转换字符类型,截取或长

度受限时,会发生该异常,如一个字符分配给一个变量,而该变量声明

的长度比该字符短,就会引发该异常

storage_errorora-06500-6500内存溢出

zerodivideora-01476-1476除数为零

case_not_foundora-06592-6530对于选择case语句,

没有与之相匹配的条件,同时,也没有else语句捕获其他的条件

cursor_already_openora-06511-6511程序试图打开一

个已经打开的游标

timeout_on_resourceora-00051-51系统在等待某一资

源,时间超时

如果要处理未命名的内部异常,必须使用OTHERS异常处理器或

PRAGMAEXCEPTIONJNIT。PRAGMA由编译器控制,或者是对于

编译器的注释。PRAGMA在编译时处理,而不是在运行时处理。

EXCEPTIONJNIT告诉编译器将异常名与ORACLE错误码结合起来,

这样可以通过名字引用任意的内部异常,并且可以通过名字为异常编写

一适当的异常处理器。

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

PRAGMAEXCEPTION_INIT(exception_name,

-Oracle_error_number);

在该语法中,异常名是声明的异常,下例是其用法:

DECLARE

deadlock_detectedEXCEPTION;

PRAGMAEXCEPTION_INIT(deadlock_detected,-60);

BEGIN

SomeoperationthatcausesanORA-00060error

EXCEPTION

WHENdeadlock_detectedTHEN

-handletheerror

END;

对于用户自定义异常,只能在PL/SQL块中的声明部分声明异常,

异常的名字由EXCEPTION关键字引入:

reservedjoanedException

产生异常后,控制传给了子程序的异常部分,将异常转向各自异常

控制块,必须在代码中使用如下的结构处理错误:

Exception

Whenexception1then

Sequenceofstatements;

Whenexception2then

Sequenceofstatements;

Whenothersthen

3、异常的抛出

由三种方式抛出异常

1.通过PL/SQL运行时引擎

2.使用RAISE语句

3.调用RAISE_APPLICATION_ERROR存储过程

当数据库或PL/SQL在运行时发生错误时,一个异常被PL/SQL运

行时引擎自动抛出。异常也可以通过RAISE语句抛出

RAISEexception_name;

显式抛出异常是程序员处理声明的异常的习惯用法,但RAISE不

限于声明了的异常,它可以抛出任何任何异常。例如,你希望用

TIMEOUT_ON_RESOURCE错误检测新的运行时异常处理器,你只需

简单的在程序中使用下面的语句:

RAISETIMEOUT_ON_RESOUCE;

比如下面一个订单输入的例子,若当订单小于库存数量,则抛出异

常,并且捕获该异常,处理异常

DECLARE

inventory_toojowEXCEPTION;

一其他声明语句

BEGIN

IForder_rec.qty>inventory_rec.qtyTHEN

RAISEinventory_t°°Jowi

ENDIF

EXCEPTION

WHENinventory_too_lowTHEN

order_rec.staus:='backordered,;

END;

RAISE_APPLICATION_ERROR内建函数用于抛出一个异常并给

异常赋予一个错误号以及错误信息。自定义异常的缺省错误号是+1,缺

省信息是User_Defined_ExceptionoRAISE_APPLICATION_ERROR

函数能够在pl/sql程序块的执行部分和异常部分调用,显式抛出带特殊

错误号的命名异常。

Raise_application_error(error_number,message[,true,false]))

错误号的范围是・20,000到・20,999。错误信息是文本字符串,最多

为2048字节。TRUE和FALSE表示是添加(TRUE)进错误堆(ERROR

STACK)还是覆盖(overwrite)错误堆(FALSE)。缺省情况下是FALSEo

如下代码所示:

IFproduct_not_foundTHEN

RAISE_APPLICATION_ERROR(-20123,'lnvaldproductcode'

TRUE);

ENDIF;

4、异常的处理

PL/SQL程序块的异常部分包含了程序处理错误的代码,当异常被

抛出时,一个异常陷阱就自动发生,程序控制离开执行部分转入异常部

分,一旦程序进入异常部分就不能再回到同一块的执行部分。下面是异

常部分的一般语法:

EXCEPTION

WHENexception_nameTHEN

Codeforhandingexception_name

[WHENanother_exceptionTHEN

Codeforhandinganother_exception]

[WHENothersTHEN

codeforhandinganyotherexception.]

用户必须在独立的WHEN子串中为每个异常设计异常处理代码,

WHENOTHERS子串必须放置在最后面作为缺省处理器处理没有显式

处理的异常。当异常发生时,控制转到异常部分,ORACLE查找当前

异常相应的WHEN..THEN语句,捕捉异常,THEN之后的代码被执行,

如果错误陷阱代码只是退出相应的嵌套块,那么程序将继续执行内部块

END后面的语句。如果没有找到相应的异常陷阱,那么将执行WHEN

OTHERSo在异常部分WHEN子串没有数量限制。

EXCEPTION

WHENinventory_too_lowTHEN

order_rec.staus:='backordered,;

replenish_inventory(inventory_nbr=>

inventory_rec.sku,inin_amount=>order_rec.qty-inventory_rec.qty):

WHENdiscontinuedJtemTHEN

-codefordiscontinuedjtemprocessing

WHENzero_divideTHEN

-codeforzero_divide

WHENOTHERSTHEN

-codeforanyotherexception

END;

当异常抛出后,控制无条件转到异常部分,这就意味着控制不能回

到异常发生的位置,当异常被处理和解决后,控制返回到上一层执行部

分的下一条语句。

BEGIN

DECLARE

bad_creditexception;

BEGIN

RAISEbad_credit;

一发生异常,控制转向;

EXCEPTION

WHENbad_creditTHEN

dbms_output.put_line('bad_credit');

END;

・・bad_credit异常处理后,控制转到这里

EXCEPTION

WHENOTHERSTHEN

-控制不会从badcredit异常转到这里

■■因为bad_credit已被处理

END;

当异常发生时,在块的内部没有该异常处理器时,控制将转到或传

播到上一层块的异常处理部分。

BEGIN

DECLARE--内部块开始

bad_creditexception;

BEGIN

RAISEbad_credit;

-发生异常,控制转向;

EXCEPTION

WHENZERO_DIVIDETHEN一不能处理bad_credite异常

dbms_output.put_line('dividebyzeroerror');

END--结束内部块

-控制不能到达这里,因为异常没有解决;

一异常部分

EXCEPTION

WHENOTHERSTHEN

一由于bad_credit没有解决,控制将转到这里

END;

5、异常的传播

没有处理的异常将沿检测异常调用程序传播到外面,当异常被处理

并解决或到达程序最外层传播停止。在声明部分抛出的异常将控制转到

上一层的异常部分。

BEGIN

executablestatements

BEGIN

todayDATE:='SYADATE';-ERRROR

BEGIN-内部块开始

dbms_output.putjine(*thislinewillnotexecute');

EXCEPTION

WHENOTHERSTHEN

•一异常不会在这里处理

END;-内部块结束

EXCEPTION

WHENOTHERSTHEN

处理异常

END

处理oracle系统自动生成系统异常外,可以使用raise来手动生成错

误。

IRaiseexception;

IRaisepackage.exception;

IRaise;

以上是raise的三种使用方法。第一种用于生成当前程序中定义的异常

或在standard中的系统异常。

Declare

Invalidjdexception;

ld_valuesvarchar(2);

Begin

ld_value:=id_for(,smith,);

Ifsubstr(id_value,1,1)!=,x5

Then

Raiseinvalidjd;

Endif;

Exception

Wheninvalidjd

Then

Dbms_output.put_line(,thisisaninvalidid!');

End;

这是一个生成自定义异常的例子,当然也可以生成系统异常:

declare

employee_id_innumber;

Begin

Selectemployeejdintoemployee_id_infromemployjistwhere

employee_name=&n;

Ifemployee_idjn=0

Then

Raisezero_devided;

Endif;

Exception

Whenzero_devided

Then

Dbms_output.put_line(^wrong!,);

End;

有一些异常是定义在非标准包中的,如UTL_FILE,DBMS_SQL以及

程序员创建的包中异常。可以使用raise的第二种用法来生成异常。

Ifday_overdue(isbn_in,browserjn)>365

Then

Raiseoverdue_pkg.book_isjost

Endif;

在最后一种raise的形式中,不带任何参数,这种情况只出现在希望将

当前的异常传到外部程序时。

Exception

Whenno_data_found

Then

Raise;

End;

Pl.sql使用raise_application_error过程来生成一个有具体描述的异

常。当使用这个过程时,当前程序被中止,输入输出参数被置为原先的

值,但任何DML对数据库所做的改动将被保留,可以在之后

用rollback命令回滚。下面是该过程的原型:

Procedureraise_application_error(

Numbinaryjnteger;

Msgvarchar2;

KeeperrorstackBooleandefaultfalse

)

其中num是在-20999到-20000之间的任何数字(但事实

上,DBMS_OUPUT和DBMS_DESCRIBLE包使用

了・20005到・20000的数字);msg是小于2K个字符的描述语,任

何大于2K的字符都将被自动丢弃;keeperrorstack默认为false,是

指清空异常栈,再将当前异常入栈,如果指定true的话就直接将当前

异常压入栈中。

CREATEORREPLACEPROCEDUREraise_byjanguage

(codejnINPLSJNTEGER)

IS

l_messageerror_table.error_string%TYPE;

BEGIN

SELECTerror_string

INTOl_message

FROMerror_table,v$nls_parametersv

WHEREerror_number=codejn

ANDstringjanguage=v.VALUE

ANDv.parameter=,NLS_LANGUAGE,;

RAISE_APPLICATION_ERROR(codejn,l_message);

END;

ORACL内部异常:

ORA-00001:违反唯一约束条件(.)

ORA-00017:请求会话以设置跟踪事件

ORA-00018:超出最大会话数

ORA-00019:超出最大会话许可数

QRA-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-00035LICENSE_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-00058DB_BLOCK_SIZE必须为才可安装此数据库(非)

ORA-00059超出DB_FILES的最大值

ORA-00060等待资源时检测到死锁

ORA-00061另一个例程设置了不同的DML_LOCKS

ORA-00062无法获得DML全表锁定;DML_LOCKS为0

ORA-00063超出LOG_FILES的最大数

ORA-00064对象过大以至无法分配在此0/S(,)

ORA-00065FIXED_DATE的初始化失败

ORA-00066LOG_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],之内

ORA-00083警告:可能损坏映射的SGA

ORA-00084全局区域必须为PGA,SGA或UGA

ORA-00085当前调用不存在

ORA-00086用户调用不存在

ORA-00087命令无法在远程例程上执行

ORA-00088共享服务器无法执行命令

ORA-00089ORADEBUG命令中无效的例程号

ORA-00090未能将内存分配给群集数据库ORADEBUG命令

ORA-00091LARGE_POOL_SIZE至少必须为

ORA-00092LARGE_POOL_SIZE必须大于LARGE_POOL_MIN_ALLOC

ORA-00093必须介于和之间

ORA-00094要求整数值

ORA-00096值对参数无效,它必须来自之间

ORA-00097使用OracleSQL特性不在SQL92级中

ORA-00099等待资源时发生超时,可能是PDML死锁所致

ORA-00100未找到数据

ORA-00101系统参数DISPATCHERS的说明无效

ORA-00102调度程序无法使用网络协议

ORA-00103无效的网络协议;供调度程序备用

ORA-00104检测到死锁;全部公用服务器已锁定等待资源

ORA-00105:未配置网络协议的调度机制

ORA-00106:无法在连接到调度程序时启动/关闭数据库

ORA-00107:无法连接到ORACLE监听器进程

ORA-00108:无法设置调度程序以同步进行连接

ORA-00111:由于服务器数目限制在,所以没有启动所有服务器

ORA-00112:仅能创建多达(最多指定)个调度程序

ORA-00113:协议名过长

ORA-00114:缺少系统参数SERVICE_NAMES的值

ORA-00115:连接被拒绝;调度程序连接表已满

ORA-00116:SERVICE_NAMES名过长

ORA-00117:系统参数SERVICE_NAMES的值超出范围

ORA-00118:系统参数DISPATCHERS的值超出范围

ORA-00119:系统参数的说明无效

ORA-00120:未启用或安装调度机制

ORA-00121:在缺少DISPATCHERS的情况下指定了SHARED_SERVERS

ORA-00122:无法初始化网络配置

ORA-00123:空闲公用服务器终止

ORA-00124:在缺少MAX_SHARED_SERVERS的情况下指定了DISPATCHERS

ORA-00125:连接被拒绝;无效的演示文稿

ORA-00126:连接被拒绝;无效的重复

ORA-00127:调度进程不存在

ORA-00128:此命令需要调度进程名

ORA-00129:监听程序地址验证失败”

ORA-00130:监听程序地址”无效

ORA-00131:网络协议不支持注册”

ORA-00132:语法错误或无法解析的网络名称“

ORA-00150:重复的事务处理ID

ORA-00151:无效的事务处理ID

ORA-00152:当前会话与请求的会话不匹配

ORA-00153:XA库中的内部错误

ORA-00154:事务处理监视器中的协议错误

ORA-00155:无法在全局事务处理之外执行工作

ORA-00160:全局事务处理长度超出了最大值()

ORA-00161:事务处理的分支长度非法(允许的最大长度为)

ORA-00162:外部dbid的长度超出了最大值()

ORA-00163内部数据库名长度超出了最大值()

ORA-00164在分布式事务处理中不允许独立的事务处理

ORA-00165不允许对远程操作进行可移植分布式自治转换

ORA-00200无法创建控制文件

ORA-00201控制文件版本与ORACLE版本不兼容

ORA-00202控制文件:“

ORA-00203使用错误的控制文件

ORA-00204读控制文件时出错(块,#块)

ORA-00205标识控制文件出错,有关详情,请检查警告日志

ORA-00206写控制文件时出错(块,#块)

ORA-00207控制文件不能用于同一数据库

ORA-00208控制文件的名称数超出限制

ORA-00209控制文件块大小不匹配,有关详情,请检查警告日志

ORA-00210无法打开指定的控制文件

ORA-00211控制文件与先前的控制文件不匹配

ORA-00212块大小低于要求的最小大小(字节)

ORA-00213不能重新使用控制文件:原文件大小为,还需

ORA-00214控制文件”版本与文件"版本不一致

ORA-00215必须至少存在一个控制文件

ORA-00216无法重新调整从8.0.2移植的控制文件大小

ORA-00217从9.0.1进行移植无法重新调整控制文件的大小

ORA-00218控制文件的块大小与DB_BLOCK_SIZE()不匹配

ORA-00219要求的控制文件大小超出了允许的最大值

ORA-00220第一个例程未安装控制文件,有关详情,请检查警告日志

ORA-00221写入控制文件出错

ORA-00222操作将重新使用当前已安装控制文件的名祢

ORA-00223转换文件无效或版本不正确

ORA-00224控制文件重设大小尝试使用非法记录类型()

ORA-00225控制文件的预期大小与实际大小不同

ORA-00226备用控制文件打开时不允许进行操作

ORA-00227控制文件中检测到损坏的块:(块,#块)

ORA-00228备用控制文件名长度超出了最大长度

ORA-00229操作不允许:已挂起快照控制文件入队

ORA-00230操作不允许:无法使用快照控制文件入队

ORA-00231快照控制文件未命名

ORA-00232快照控制文件不存在,已损坏或无法读取

ORA-00233控制文件副本已损坏或无法读取

ORA-00234标识或打开快照或复制控制文件时出错

ORA-00235控制文件固定表因并发更新而不一致

ORA-00236快照操作不允许:挂上的控制文件为备份文件

ORA-00237快照操作不允许:控制文件新近创建

ORA-00238操作将重用属于数据库一部分的文件名

ORA-00250未启动存档器

ORA-00251LOG_ARCHIVE_DUPLEX_DEST不能是与字符串相同的目的地

ORA-00252日志在线程上为空,无法存档

ORA-00253字符限制在以内,归档目的字符串超出此限制

ORA-00254存档控制字符串”时出错

ORA-00255存档日志(线程,序列#)时出错

ORA-00256无法翻译归档目的字符串

ORA-00257存档器错误。在释放之前仅限于内部连接

ORA-00258NOARCHIVELOG模式下的人工存档必须标识日志

ORA-00259日志(打开线程)为当前日志,无法存档

ORA-00260无法找到联机日志序列(线程)

ORA-00261正在存档或修改日志(线程)

ORA-00262当前日志(关闭线程)无法切换

ORA-00263线程没有需要存档的记录

ORA-00264不要求恢复

ORA-00265要求例程恢复,无法设置ARCHIVELOG模式

ORA-00266需要存档日志文件名

ORA-00267无需存档日志文件名

ORA-00268指定的日志文件不存在n

ORA-00269指定的日志文件为线程的一部分(非)

ORA-00270创建存档日志时出错

ORA-00271没有需要存档的日志

ORA-00272写存档日志时出错

ORA-00273未记录的直接加载数据的介质恢复

ORA-00274非法恢复选项

ORA-00275已经开始介质恢复

ORA-00276CHANGE关键字已指定但未给出更改编号

ORA-00277UNTIL恢复标志的非法选项

ORA-00278:此恢复不再需要日志文件,,

ORA-00279:更改(在生成)对于线程是必需的

ORA-00280:更改对于线程是按序列#进行的

ORA-00281不能使用调度进程执行介质恢复

ORA-00282UPI调用不被支持,请使用ALTERDATABASERECOVER

ORA-00283恢复会话因错误而取消

ORA-00284恢复会话仍在进行

ORA-00285TIME未作为字符串常数给出

ORA-00286无可用成员,或成员无有效数据

ORA-00287未找到指定的更改编号(在线程中)

ORA-00288要继续恢复,请键入ALTERDATABASERECOVERCONTINUE

ORA-00289建议:

ORA-00290操作系统出现存档错误。请参阅下面的错俣

ORA-00291P

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论