版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第11章章 异常处理异常处理黑龙江大学黑龙江大学计算机科学技术学院计算机科学技术学院2异常处理异常处理u异常概述异常概述u异常处理过程异常处理过程 u异常的传播异常的传播311.1异常概述异常概述uOracle错误处理机制错误处理机制u异常的类型异常的类型4Oracle错误处理机制错误处理机制u一个一个错误错误对应对应一个异常一个异常,当错误产生时抛出,当错误产生时抛出相应的异常,并被相应的异常,并被异常处理器异常处理器捕获,程序控捕获,程序控制权传递给异常处理器,由制权传递给异常处理器,由异常处理器异常处理器来处来处理运行时错误。理运行时错误。 5u预定义的预定义的Oracle异常异常u非
2、预定义的非预定义的Oracle异常异常u用户定义的异常用户定义的异常 异常的类型异常的类型6预定义的异常预定义的异常异常情况名异常情况名错误代码错误代码描述描述CURSOR_ALREADY_OPEN ORA-06511 尝试打开已经打开的游标尝试打开已经打开的游标 INVALID_CURSORORA-01001不合法的游标操作(如要打开已不合法的游标操作(如要打开已经关闭的游标)经关闭的游标) NO_DATA_FOUNDORA-01403没有发现数据没有发现数据 TOO_MANY_ROWSORA-01422一个一个SELECT INTO语句匹配多语句匹配多个数据行个数据行INVALID_NUM
3、BERORA-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失败失败TIME
4、OUT_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给空对象属
5、性赋值给空对象属性赋值COLLECTION_IS_NULLORA-06531对某对某NULL PL/SQL表或表或可变数组试图应用集合可变数组试图应用集合方法,而不是方法,而不是EXISTS SELF_IS_NULLORA-30625调用空对象实例的方法调用空对象实例的方法SUBSCRIPT_BEYOND_COUNTORA-06533对嵌套表或数组索引引对嵌套表或数组索引引用时超出集合中元素的用时超出集合中元素的数量数量SUBSCRIPT_OUTSIDE_LIMITORA-06532对嵌套表或可变数组索对嵌套表或可变数组索引的引用超出声明的范引的引用超出声明的范围围预定义的异常预定义的异常9非
6、预定义异常非预定义异常u在语句块的声明部分声明一个异常名称在语句块的声明部分声明一个异常名称 e_integrity EXCEPTION;u通过通过PRAGMA EXCEPTION-INIT 将异常将异常与与一个一个Oracle错误号相关联错误号相关联: : PRAGMA EXCEPTION-INIT(e_integrity.-2291)u在异常处理部分捕捉并处理异常:在异常处理部分捕捉并处理异常: WHEN e_integrity THEN . 10非预定义异常非预定义异常u在语句块的声明部分声明一个异常名称在语句块的声明部分声明一个异常名称 e_integrity EXCEPTION;u通
7、过通过PRAGMA EXCEPTION-INIT 将异常将异常与与一个一个Oracle错误号相关联错误号相关联: : PRAGMA EXCEPTION-INIT(e_integrity.-2291)u在异常处理部分捕捉并处理异常:在异常处理部分捕捉并处理异常: WHEN e_integrity THEN . 11用户自定义的异常用户自定义的异常u用户自定义异常必须在用户自定义异常必须在声明部分进行声明声明部分进行声明。u当异常发生时,系统不能自动触发,需要用当异常发生时,系统不能自动触发,需要用户户使用使用RAISE语句语句。u在在异常处理部分异常处理部分捕捉并处理异常。捕捉并处理异常。12异
8、常处理过程异常处理过程u在在声明部分声明部分为错误为错误定义异常定义异常,包括,包括非预定义非预定义异常异常和和用户定义用户定义异常。异常。e_exception EXCEPTION;PRAGMA EXCEPTION_INIT(e_exceptioin,-#);u在在执行过程中执行过程中当错误产生时当错误产生时抛出抛出与错误对应的与错误对应的异异常常。RAISE user_define_exception;u在在异常处理部分异常处理部分通过异常处理器通过异常处理器捕获异常捕获异常,并进,并进行行异常处理异常处理。13异常的捕获与处理异常的捕获与处理u异常处理器的基本形式为异常处理器的基本形式为
9、EXCEPTIONWHEN exception1OR excetpion2THEN sequence_of_statements1;WHEN exceptioin3OR exception4THEN sequence_of_statements2; WHEN OTHERS THEN sequence_of_statementsn;END;u注意注意:1.一个异常处理器可以一个异常处理器可以捕获多个异常捕获多个异常,只需要在,只需要在WHEN子句子句中用中用OR连接即可;连接即可;2.一个异常一个异常只能被一个只能被一个异常处理器捕获,并进行处理。异常处理器捕获,并进行处理。 14u查询名为查询
10、名为SMITH的员工工资,如果该员工不存在,的员工工资,如果该员工不存在,则输出则输出“There is not such an employee!”;如果;如果存在多个同名的员工,则输出其员工号和工资。存在多个同名的员工,则输出其员工号和工资。DECLARE v_sal emp.sal%type;BEGIN SELECT sal INTO v_sal FROM emp WHERE ename=SMITH; DBMS_OUTPUT.PUT_LINE(v_sal);EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(There is no
11、t such an emplyee!); WHEN TOO_MANY_ROWS THEN FOR v_emp IN (SELECT * FROM emp WHERE ename=SMITH) LOOP DBMS_OUTPUT.PUT_LINE(v_emp.empno| |v_emp.sal); END LOOP;END;异常的处理异常的处理 实例实例15u删除删除dept表中部门号为表中部门号为10的部门信息,如果不能删除则输出的部门信息,如果不能删除则输出“There are subrecords in emp table!”。DECLARE e_deptno_fk EXCEPTION; P
12、RAGMA EXCEPTION_INIT(e_deptno_fk,-2292);BEGIN DELETE FROM dept WHERE deptno=10;EXCEPTION WHEN e_deptno_fk THEN DBMS_OUTPUT.PUT_LINE( There are subrecords in emp table!);END;异常的处理异常的处理 实例实例16u修改修改7844员工的工资,保证修改后工资不超过员工的工资,保证修改后工资不超过6000DECLARE e_highlimit EXCEPTION; v_sal emp.sal%TYPE;BEGIN UPDATE em
13、p SET sal=sal+100 WHERE empno=7844 RETURNING sal INTO v_sal; IF v_sal6000 THEN RAISE e_highlimit; END IF;EXCEPTION WHEN e_highlimit THEN DBMS_OUTPUT.PUT_LINE(The salary is too large!); ROLLBACK;END; 自定义异常的处理自定义异常的处理 实例实例17OTHERS异常处理器异常处理器uOTHERS异常处理器异常处理器是一个特殊的异常处理是一个特殊的异常处理器,可以捕获所有的异常。器,可以捕获所有的异常。u
14、通常,通常,OTHERS异常处理器总是作为异常处异常处理器总是作为异常处理部分的理部分的最后一个异常处理器最后一个异常处理器,负责处理那,负责处理那些些没有被其他异常处理器捕获没有被其他异常处理器捕获的异常。的异常。 18DECLARE v_sal emp.sal%TYPE; e_highlimit EXCEPTION;BEGIN SELECT sal INTO v_sal FROM emp WHERE ename=JOAN; UPDATE emp SET sal=sal+100 WHERE empno=7900; IF v_sal6000 THEN RAISE e_highlimit; EN
15、D IF;EXCEPTION WHEN e_highlimit THEN DBMS_OUTPUT.PUT_LINE(The salary is too large!); ROLLBACK; WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(There is some wrong in selecting!);END; OTHERS异常处理器异常处理器19错误相关信息的获取错误相关信息的获取u可以通过两个函数来获取错误相关信息。可以通过两个函数来获取错误相关信息。SQLCODE:返回当前错误代码。:返回当前错误代码。如果是如果是用户定义错误返回值为用户定义错误返回值为1
16、;如果是如果是ORA-1403:NO DATA FOUND错误,返回值为错误,返回值为100;其他其他Oracle内部错误返回相应的错误号内部错误返回相应的错误号。 SQLERRM(错误码错误码):返回当前错误的消息文本。:返回当前错误的消息文本。如果是如果是Oracle内部错误,返回内部错误,返回系统内部的错误描述系统内部的错误描述;如果是如果是用户定义错误用户定义错误,则,则返回信息文本为返回信息文本为“User-defined Exception”。 20DECLARE v_sal emp.sal%TYPE; e_highlimit EXCEPTION; v_code NUMBER(6)
17、; v_text VARCHAR2(200);BEGIN SELECT sal INTO v_sal FROM emp WHERE ename=JOAN; UPDATE emp SET sal=sal+100 WHERE empno=7900; IF v_sal6000 THEN RAISE e_highlimit; END IF;EXCEPTION WHEN e_highlimit THEN DBMS_OUTPUT.PUT_LINE(The salary is too large!); ROLLBACK; WHEN OTHERS THEN v_code:=SQLCODE; v_text:=S
18、QLERRM; DBMS_OUTPUT.PUT_LINE(v_code| |v_text);END; 错误相关信息的获取错误相关信息的获取21DECLARE v_text VARCHAR2(200);BEGIN For a in -1000.1 loop v_text:=SQLERRM(a); DBMS_OUTPUT.PUT_LINE(v_code| |v_text); End loop;END; 错误相关信息的获取错误相关信息的获取22异常的传播异常的传播u可执行部分异常的传播可执行部分异常的传播v如果如果当前语句块有该异常的处理器当前语句块有该异常的处理器,则执行之,则执行之,并且成功完成
19、该语句块。然后,并且成功完成该语句块。然后,控制权传递控制权传递到外层语句块到外层语句块。 v如果如果当前语句块没有该异常的处理器当前语句块没有该异常的处理器,则通过,则通过在在外层语句块中产生该异常来传播该异常外层语句块中产生该异常来传播该异常。然。然后,执行对外层语句块执行步骤后,执行对外层语句块执行步骤1。如果没有外如果没有外层语句块,则该异常将传播到调用环境层语句块,则该异常将传播到调用环境。 23异常的传播异常的传播DECLARE v_sal emp.sal%TYPE;BEGIN BEGIN SELECT sal INTO v_sal FROM emp WHERE ename=JOA
20、N; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(There is not such an employee!); END; DBMS_OUTPUT.PUT_LINE(Now this is outputted by outer block!);END;/There is not such an employee!Now this is outputted by outer block! 24DECLARE v_sal emp.sal%TYPE;BEGIN BEGIN SELECT sal INTO v_sal FROM emp WHERE deptno=10; EX
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 灵枢针法临床操作安全手册
- 中医推拿标准化操作手册
- 高温作业岗位防护措施指引
- 客情维护服务操作规范
- 番茄大棚绿色种植技术规范
- 蜜蜂越冬蜂群保温管理指南
- 防暑降温措施实施与现场防护规范
- 小麦氮肥后移增产技术方案
- 全身体态风险评估方案
- 生鲜农产品入市检测标准
- QHDCTS0004-2024中国电信移动终端测试方法非手持卫星终端分册(2024v1)
- 重药集团笔试题及答案
- 肺结节诊治中国专家共识(2024年版)解读
- 校园文印室外包服务投标方案(技术标)
- 人教版八年级数学下册 (数据的波动程度)数据的分析课件教学(第1课时)
- 肾病内科诊疗指南汇编
- 汽车售后服务接待流程
- 重庆桃源居机电安装施工方案
- HY/T 250-2018无居民海岛开发利用测量规范
- GB/T 1527-2017铜及铜合金拉制管
- GB 4053.1-1993固定式钢直梯安全技术条件
评论
0/150
提交评论