版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、一个实例
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 皮肤过敏的识别与应对
- 与老师共度的节日记叙文作文11篇范文
- 加油站合作协议样本
- 建筑工程中介居间合同范本修订指南
- 免疫缺陷病护理中的人文关怀与心理支持
- 内乡县人民医院2026年招聘卫生专业技术人员备考题库及完整答案详解1套
- 2026年重庆农投肉食品有限公司招聘13人备考题库及答案详解(考点梳理)
- 2026年云南大学附属中学星耀学校招聘备考题库及1套参考答案详解
- 2026年浙江招聘恒信农商银行专职清非人员的备考题库及完整答案详解
- 2026年厦门市集美区乐安小学非在编教师招聘备考题库有答案详解
- 江苏省2025年普通高中学业水平合格性考试试卷英语试卷(含答案详解)
- 2025云南省人民检察院招聘22人笔试考试备考题库及答案解析
- 2026年安全生产管理培训课件与事故预防与应急处理方案
- 2026年长沙民政职业技术学院单招职业技能考试题库及答案详解一套
- 医学检验质控课件
- 人教鄂教版(2017秋)小学科学四年级上册期末综合质量检测卷(含答案)
- 湘教版八年级地理上册 第三章《中国的自然资源》单元测试卷及答案
- 腭裂喂养护理:新生儿与婴儿喂养技巧
- 2025湘教版八年级地理上册期末复习全册知识点提纲
- DB63∕T 1917-2021 森林防火隔离带建设技术规程
- 呼吸机管路护理与VAP预防的关键措施
评论
0/150
提交评论