第11章异常处理_第1页
第11章异常处理_第2页
第11章异常处理_第3页
第11章异常处理_第4页
第11章异常处理_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

第11章异常处理黑龙江大学计算机科学技术学院2异常处理异常概述异常处理过程异常的传播311.1异常概述Oracle错误处理机制异常的类型4Oracle错误处理机制一个错误对应一个异常,当错误产生时抛出相应的异常,并被异常处理器捕获,程序控制权传递给异常处理器,由异常处理器来处理运行时错误。5预定义的Oracle异常非预定义的Oracle异常用户定义的异常异常的类型6预定义的异常异常情况名错误代码描述CURSOR_ALREADY_OPENORA-06511尝试打开已经打开的游标

INVALID_CURSORORA-01001不合法的游标操作(如要打开已经关闭的游标)

NO_DATA_FOUNDORA-01403没有发现数据

TOO_MANY_ROWSORA-01422一个SELECTINTO语句匹配多个数据行INVALID_NUMBERORA-01722转换成数字失败

(‘X’)

VALUE_ERRORORA-06502截断、算法或转换错误,通常出现在赋值错误

ZERO_DIVIDEORA-01476除数为0

ROWTYPE_MISMATCHORA-06504主机游标变量与PL/SQL游标变量类型不匹配7异常情况名错误代码描述DUP_VAL_ON_INDEXORA-00001违反唯一性约束或主键约束SYS_INVALID_ROWIDORA-01410转换成ROWID失败TIMEOUT_ON_RESOURCEORA-00051在等待资源中出现超时LOGIN_DENIEDORA-01017无效用户名/密码CASE_NOT_FOUNDORA-06592没有匹配的WHEN子句NOT_LOGGED_ONORA-01012没有与数据库建立连接STORAGE_ERRORORA-06500PL/SQL内部错误PROGRAM_ERRORORA-06501PL/SQL内部错误预定义的异常8异常情况名错误代码描述ACCESS_INTO_NULLORA-06530给空对象属性赋值COLLECTION_IS_NULLORA-06531对某NULLPL/SQL表或可变数组试图应用集合方法,而不是EXISTS

SELF_IS_NULLORA-30625调用空对象实例的方法SUBSCRIPT_BEYOND_COUNTORA-06533对嵌套表或数组索引引用时超出集合中元素的数量SUBSCRIPT_OUTSIDE_LIMITORA-06532对嵌套表或可变数组索引的引用超出声明的范围预定义的异常9非预定义异常在语句块的声明部分声明一个异常名称e_integrityEXCEPTION;通过PRAGMAEXCEPTION-INIT将异常与一个Oracle错误号相关联:

PRAGMAEXCEPTION-INIT(e_integrity.-2291)在异常处理部分捕捉并处理异常:WHENe_integrityTHEN...

10非预定义异常在语句块的声明部分声明一个异常名称e_integrityEXCEPTION;通过PRAGMAEXCEPTION-INIT将异常与一个Oracle错误号相关联:

PRAGMAEXCEPTION-INIT(e_integrity.-2291)在异常处理部分捕捉并处理异常:WHENe_integrityTHEN...

11用户自定义的异常用户自定义异常必须在声明部分进行声明。当异常发生时,系统不能自动触发,需要用户使用RAISE语句。在异常处理部分捕捉并处理异常。12异常处理过程在声明部分为错误定义异常,包括非预定义异常和用户定义异常。e_exceptionEXCEPTION;PRAGMAEXCEPTION_INIT(e_exceptioin,-#####);在执行过程中当错误产生时抛出与错误对应的异常。RAISEuser_define_exception;在异常处理部分通过异常处理器捕获异常,并进行异常处理。13异常的捕获与处理异常处理器的基本形式为EXCEPTIONWHENexception1[ORexcetpion2…]THEN

sequence_of_statements1;WHENexceptioin3[ORexception4…]THENsequence_of_statements2;

……WHENOTHERSTHENsequence_of_statementsn;END;注意:一个异常处理器可以捕获多个异常,只需要在WHEN子句中用OR连接即可;一个异常只能被一个异常处理器捕获,并进行处理。14查询名为SMITH的员工工资,如果该员工不存在,则输出“Thereisnotsuchanemployee!”;如果存在多个同名的员工,则输出其员工号和工资。DECLAREv_salemp.sal%type;BEGINSELECTsalINTOv_salFROMempWHEREename='SMITH';DBMS_OUTPUT.PUT_LINE(v_sal);EXCEPTIONWHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE('Thereisnotsuchanemplyee!');WHENTOO_MANY_ROWSTHENFORv_empIN(SELECT*FROMempWHEREename='SMITH')LOOPDBMS_OUTPUT.PUT_LINE(v_emp.empno||''||v_emp.sal);ENDLOOP;END;异常的处理实例15删除dept表中部门号为10的部门信息,如果不能删除则输出“Therearesubrecordsinemptable!”。DECLAREe_deptno_fkEXCEPTION;

PRAGMAEXCEPTION_INIT(e_deptno_fk,-2292);BEGINDELETEFROMdeptWHEREdeptno=10;EXCEPTIONWHENe_deptno_fkTHENDBMS_OUTPUT.PUT_LINE('Therearesubrecordsinemptable!');END;异常的处理实例16修改7844员工的工资,保证修改后工资不超过6000DECLARE

e_highlimitEXCEPTION;v_salemp.sal%TYPE;BEGINUPDATEempSETsal=sal+100WHEREempno=7844RETURNINGsalINTOv_sal;IFv_sal>6000THENRAISEe_highlimit;ENDIF;EXCEPTIONWHENe_highlimitTHENDBMS_OUTPUT.PUT_LINE('Thesalaryistoolarge!');ROLLBACK;END;自定义异常的处理实例17OTHERS异常处理器OTHERS异常处理器是一个特殊的异常处理器,可以捕获所有的异常。通常,OTHERS异常处理器总是作为异常处理部分的最后一个异常处理器,负责处理那些没有被其他异常处理器捕获的异常。18DECLAREv_salemp.sal%TYPE;e_highlimitEXCEPTION;BEGINSELECTsalINTOv_salFROMempWHEREename='JOAN';UPDATEempSETsal=sal+100WHEREempno=7900;IFv_sal>6000THENRAISEe_highlimit;ENDIF;EXCEPTIONWHENe_highlimitTHENDBMS_OUTPUT.PUT_LINE('Thesalaryistoolarge!');ROLLBACK;

WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE('Thereissomewronginselecting!');END;OTHERS异常处理器19错误相关信息的获取可以通过两个函数来获取错误相关信息。SQLCODE:返回当前错误代码。如果是用户定义错误返回值为1;如果是ORA-1403:NODATAFOUND错误,返回值为100;其他Oracle内部错误返回相应的错误号。SQLERRM(错误码):返回当前错误的消息文本。如果是Oracle内部错误,返回系统内部的错误描述;如果是用户定义错误,则返回信息文本为“User-definedException”。20DECLAREv_salemp.sal%TYPE; e_highlimitEXCEPTION; v_codeNUMBER(6); v_textVARCHAR2(200);BEGIN SELECTsalINTOv_salFROMempWHEREename='JOAN'; UPDATEempSETsal=sal+100WHEREempno=7900; IFv_sal>6000THEN RAISEe_highlimit; ENDIF;EXCEPTION WHENe_highlimitTHEN DBMS_OUTPUT.PUT_LINE('Thesalaryistoolarge!'); ROLLBACK; WHENOTHERSTHEN v_code:=SQLCODE; v_text:=SQLERRM; DBMS_OUTPUT.PUT_LINE(v_code||''||v_text);END;错误相关信息的获取21DECLARE v_textVARCHAR2(200);BEGINForain-1000..1loop v_text:=SQLERRM(a); DBMS_OUTPUT.PUT_LINE(v_code||''||v_text);Endloop;END;错误相关信息的获取22异常的传播可执行部分异常的传播如果当前语句块有该异常的处理器,则执行之,并且成功完成该语句块。然后,控制权传递到外层语句块。

如果当前语句块没有该异常的处理器,则通过在外层语句块中产生该异常来传播该异常。然后,执行对外层语句块执行步骤1。如果没有外层语句块,则该异常将传播到调用环境。

23异常的传播DECLAREv_salemp.sal%TYPE;BEGINBEGINSELECTsalINTOv_salFROMempWHEREename='JOAN';EXCEPTIONWHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE('Thereisnotsuchanemployee!');END;

DBMS_OUTPUT.PUT_LINE('Nowthisisoutputtedbyouterblock!');END;/Thereisnotsuchanemployee!Nowthisisoutputtedbyouterblock!24DECLARE v_salemp.sal%TYPE;BEGIN BEGIN SELECTsalINTOv_salFROMempWHEREdeptno=10; EXCEPTION WHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE('Thereisnotsuchanemployee!');END; DBMS_OUTPUT.PUT_LINE('Nowthisisoutputtedbyouterblock

温馨提示

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

评论

0/150

提交评论