- 1、本文档共143页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 7.6.1 系统预定义异常处理 系统预定义异常处理是针对PL/SQL程序编译、执行过程中发生的系统预定义异常问题进行处理的程序。无论是违反Oracle规则还是超出系统规定的限度,都会引发系统异常,如例7.10、例7.21和例7.24,在编译时均出现编译错误,两例中均违反了系统规定。系统预定义异常处理一般由系统自动触发,也可以利用后面介绍的自定义异常的触发方法来显式触发系统预定义异常。Oracle常用的系统预定义异常如表7-5所示。 预定义异常名 描述 ACCESS_INTO_NULL 试图给一个没有初始化的对象赋值 CURSOR_ALREADY_OPEN 试图打开一个已经打开的游标 DUP_VAL_ON_INDEX 试图在一个有惟一性约束的字段中存储重复的值 INVALID_CURSOR 试图执行一个无效的游标 LOGIN_DENIED 用一个无效的用户名或口令登录 NO_DATA_FOUND 查询语句没有返回数据 NOT_LOGGED_ON 连接数据库失败 SUBSCRIPT_OUTSIDE_LIMIT 表或数组类型变量中索引值超出系统范围 SUBSCRIPT_BEYOND_COUNT 表或数组类型变量中索引值超出定义范围 TOO_MANY_ROWS 查询语句返回多行数据 VALUE_ERROR 变量转换时形成无效值 ZERO_DIVIDE 被零除 * 7.6.1 系统预定义异常处理 【例7.32 】编写计算“10÷0”的PL/SQL程序,比较编写和不编写系统预定义异常处理程序的区别。 (1)未编写系统预定义异常处理程序 DECLARE n1 NUMBER:=0; n2 NUMBER:=10; BEGIN n2:=n2/n1; DBMS_OUTPUT.PUT_LINE(n2); END; * 7.6.1 系统预定义异常处理 (2)编写系统预定义异常处理程序 DECLARE n1 NUMBER:=0; n2 NUMBER:=10; BEGIN n2:=n2/n1; DBMS_OUTPUT.PUT_LINE(n2); EXCEPTION WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.PUT_LINE(除数为零!); END; * 7.6.2 自定义异常处理 7.6 异常处理 7.6.1 系统预定义异常处理 * 7.6.2 自定义异常处理 自定义异常处理是用户根据需要自己编写的异常处理程序,自定义异常处理由用户触发。自定义异常处理先定义,后触发,再处理。 ⒈ 定义异常处理 在PL/SQL程序块的DECLARE中定义异常处理,定义异常处理的格式如下: 异常处理名 EXCEPTION; 异常处理名是用户定义的,EXCEPTION是异常处理关键字。 ⒉ 触发异常处理 在PL/SQL程序块的执行部分需要执行异常处理处写触发语句,触发异常处理的触发语句格式如下: RAISE 异常处理名; * 7.6.2 自定义异常处理 ⒊ 处理异常 一个PL/SQL程序块中可以包含多个异常处理,根据不同的异常处理名来执行不同的异常处理程序。在PL/SQL程序块的EXCEPTION中编写异常处理程序,定义异常处理程序的方法如下: EXCEPTION WHEN 异常处理名1 THEN 异常处理语句序列1; …… WHEN 异常处理名n THEN 异常处理语句序列n; * 7.6.2 自定义异常处理 【例7.33 】先将学号为“010101”的学生的班级编号改为“0202”,再编写利用自定义异常处理来检测班级编号与学号的前四位是否一致,如果不一致则触发自定义异常,输出“学号前4位与班级编号不一致!”的提示信息,否则输出该学生班级编号的PL/SQL程序。 第一步:修改“010101”学生的班级编号为“0202” UPDATE student SET class_no=0202 WHERE s_no=010101; * 7.6.2 自定义异常处理 第二步:编写自定义异常检测班级编号与学号的前四位是否一致 DECLARE pcno student.class_no%TYPE; --定义自定义异常处理名 pp EXCEPTION; BEGIN SELECT class_no INTO pcno FROM student WHERE s_no=010101; IF pcno0101 THEN RAISE pp; --触发自定义异常 ELSE DBMS_OUTPUT.PUT_LINE
文档评论(0)