PLSQL总结-3(异常处理及嵌套块).ppt
《PLSQL总结-3(异常处理及嵌套块).ppt》由会员分享,可在线阅读,更多相关《PLSQL总结-3(异常处理及嵌套块).ppt(82页珍藏版)》请在三一办公上搜索。
1、PL/SQL 总结-3,目录,处理异常捕获 Oracle Server 异常捕获用户定义异常识别变量作用域,处理异常,本部分将讲解:在 PL/SQL 代码中包含异常处理代码的优点PL/SQL 块异常处理部分的目的 异常处理指南,处理异常,前面学了如何在 PL/SQL 块中编写声明部分和执行部分.所有要执行的 SQL 和 PL/SQL 代码都写在执行部分.迄今为止我们假设代码只有编译错误.然而,代码会发生难以预料的运行时错误.本部分学习如何在 PL/SQL 块中处理这些运行时错误.,什么是异常?,异常是程序的运行时错误,异常会中断程序的正常执行.异常的产生有多种原因:用户输入错误;硬件错误;网页
2、不存在;等等.你使用应用程序和网站时遇到过错误吗?,PL/SQL 中的异常,下例运行正常.但是如果输入的是 Korea,South 而不是 Republic of Korea 呢?DECLARE v_country_name wf_countries.country_name%TYPE:=Republic of Korea;v_elevation wf_countries.highest_elevation%TYPE;BEGIN SELECT highest_elevation INTO v_elevation FROM wf_countries WHERE country_name=v_co
3、untry_name;DBMS_OUTPUT.PUT_LINE(v_country_name);END;,PL/SQL 中的异常,DECLARE v_country_name wf_countries.country_name%TYPE:=Republic of Korea;v_elevation wf_countries.highest_elevation%TYPE;BEGIN SELECT highest_elevation INTO v_elevation FROM wf_countries WHERE country_name=v_country_name;DBMS_OUTPUT.PU
4、T_LINE(v_country_name);END;,PL/SQL 中的异常,代码没有按预期的运行.没有找到有关 Korea,South 的数据,因为国家名实际上是按 Republic of Korea 存储的.这类 PL/SQL 错误称为异常.异常发生时,我们说异常被“抛出”.异常被抛出时,异常点之后 PL/SQL 块执行部分的剩余代码不再执行.,什么是异常处理代码?,异常处理代码定义了异常发生后应当执行的恢复操作.编写代码时,程序员应当预见到代码执行时可能发生的错误的类型.然后为每一种错误编写异常处理代码.异常处理代码是程序员为代码错误编制的处理预案.,什么是异常处理代码?,程序员使用异
5、常处理代码来处理哪些错误?系统错误(比如磁盘空间耗尽)数据错误(比如,主键值重复)用户错误(比如,数据输入错误)很多其它的可能性!,为什么异常处理重要?,你能说明为什么异常处理如此重要吗?可能的原因包括:减轻错误对用户的 影响(频繁的错误使用户沮丧甚至拒绝使用程序)保护数据库(避免数据丢失或被覆盖)错误消耗大量系统资源(错误发生后,纠正错误代价高昂;用户频繁打电话请求帮助).代码更加易读,因为错误处理代码可在同一个块中的独立部分处理错误.,处理 PL/SQL异常,PL/SQL 抛出异常,块执行结束但可编写异常处理代码,在块结束前执行最后的操作.异常处理部分以关键字 EXCEPTION 开始.,
6、处理 PL/SQL异常,异常如果被处理,PL/SQL 程序就不会突然中断.异常抛出后,控制转到异常处理部分,执行相应的处理代码.之后,PL/SQL 块正常、成功结束.一个时刻只能发生一个异常.异常发生时,PL/SQL 在块结束前只执行一个异常处理代码.,处理 PL/SQL异常,点 A 的代码不会执行,因为 SELECT 语句失败.,处理 PL/SQL异常,下面是另一示例.块中select 语句用于获取 John 的last_name.DECLARE v_lname VARCHAR2(15);BEGIN SELECT last_name INTO v_lname FROM employees W
7、HERE first_name like El%;DBMS_OUTPUT.PUT_LINE(Ellens last name is:|v_lname);END;然而,因为有多个 John 所以会产生异常.,处理 PL/SQL异常,下例中异常处理代码用于处理 预定义的Oracle 服务错误 TOO_MANY_ROWS.下部分将详细学习预定义的Oracle 服务错误.DECLARE v_lname employees.last_name%TYPE;BEGIN SELECT last_name INTO v_lname FROM employees WHERE first_name like El%
8、;DBMS_OUTPUT.PUT_LINE(Ellens last name is:|v_lname);EXCEPTION WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE(Your select statement retrieved multiple rows.Consider using a cursor.);END;,捕获异常,你可通过在PL/SQL块的异常处理部分增加相应的处理代码来处理或捕获(trap)任何错误.语法:,捕获异常,每个异常处理代码包含一个 WHEN 子句,其后是异常名,然后是 THEN 引导的异常处理语句.在 EXCEPTIO
9、N 部分可包含任意多个异常处理代码来处理特定的异常.然而,不能为同一个异常编写多个异常处理代码.,捕获异常,语法中:exception 是预定义的异常名或用户在声明部分定义的异常名statement 是一个或多个 PL/SQL 或 SQL 语句OTHERS 是可选的异常处理子句,用于捕获 前面没有明确捕获的任何异常,OTHERS 关键字,异常处理部分只捕获那些 WHEN 子句说明的异常;其它任何异常都不会被捕获,除非后面也使用了 OTHERS 子句.OTHERS 子句捕获前面没有捕获的异常.如果使用,OTHERS 必须是异常处理最后一个子句.,OTHERS 关键字,考虑下面的例子:如果程序抛出
10、 NO_DATA_FOUND 异常,则执行 statement1 如果程序抛出 TOO_MANY_ROWS异常,则执行 statement2如果程序抛出了其他异常,则执行 statement3,捕获异常指南,如果有可能发生错误,就要添加异常处理代码.在计算时,字符串操作时,执行 SQL 语句时都有可能发生错误.如果有可能,尽量按名称处理异常 而不是用 OTHERS 捕获异常.掌握预定义异常的名称及其产生的原因.用不同的坏数据及其组合测试代码,发现可能出现的错误.在异常处理代码中输出调试信息.仔细考虑每个异常处理代码是需要提交事务,还是撤销事务,或是让事务继续.不管错误多么严重,我们都要使数据库
11、处于一致状态,避免保存任何坏数据.,处理异常,本部分讲解了:在 PL/SQL 代码中包含异常处理代码的优点PL/SQL 块异常处理部分的目的 异常处理指南,捕获 Oracle Server 异常,本部分将讲解:Oracle 服务异常用户自定义异常显式和隐式抛出的异常捕获预定义的 Oracle Server异常捕获非预定义的 Oracle Server 错误通过错误代码和错误消息识别异常,捕获 Oracle Server 异常,PL/SQL 错误处理非常灵活,允许程序员处理用户定义异常和 Oracle定义异常.本部分学习预定义和非预定义 Oracle 服务错误.预定义错误是常见的 Oracle
12、错误,为了方便,PL/SQL 已经为其定义了异常名.非预定义错误使用 ORA 错误代码和消息.两种错误处理语法不同,但你可在 EXCEPTION 处理部分捕获所有这两种错误.,Exception Types,在 PL/SQL中处理异常,有两种方式抛出异常:Oracle 服务隐式(自动)抛出:Oracle 服务发生错误时,异常自动抛出.例如,单行SELECT 查询如果没有返回数据,则发生编号 ORA-01403 的错误,then PL/SQL 抛出 NO_DATA_FOUND 异常.程序员显式(明确)抛出:根据程序要实现的功能,有时需要显式抛出异常.可通过 RAISE 语句明确的抛出异常.RAI
13、SE 语句抛出的异常可以是用户定义的,也可是Oracle预先定义好的.下一部分详细解释.,两种 Oracle 服务错误,Oracle 服务发生错误时,相关异常自动抛出,执行部分剩余代码被忽略,在异常处理部分寻找对应异常处理代码.有两种Oracle 服务错误:预定义Oracle 服务错误:此类错误有预先定义好的异常名.如,错误 ORA-01403 的异常名为 NO_DATA_FOUND.非预定义Oracle 服务错误:此类错误没有预先定义好的异常名,只有形如(ORA-nnnnn)的标准错误编号和错误描述消息.可以为此类错误声明一个异常名,从而可以在异常处理部分使用此名称捕获该异常.,捕获预定义O
14、racle 服务错误,在异常处理代码中引用预定义的异常名.下面是几个预定义异常的例子:NO_DATA_FOUNDTOO_MANY_ROWSINVALID_CURSORZERO_DIVIDEDUP_VAL_ON_INDEXplsql_s06_l02_predefined_errors.doc 文档中给出了部分预定义异常.完整异常列表参看 PL/SQL Users Guide and Reference.,捕获预定义Oracle 服务错误,下例中使用了预定义Oracle错误TOO_MANY_ROWS 注意预定义Oracle错误无需声明,直接使用DECLARE v_lname VARCHAR2(15
15、);BEGIN SELECT last_name INTO v_lname FROM employees WHERE first_name like El%;DBMS_OUTPUT.PUT_LINE(Ellens last name is:|v_lname);EXCEPTION WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE(Your select statement retrieved multiple rows.Consider using a cursor.);END;,捕获多个预定义Oracle 服务错误,下例处理了 TOO_MANY_ROWS
16、 和 NO_DATA_FOUND 异常,并使用 OTHERS 来处理其它可能的异常.DECLARE v_lname VARCHAR2(15);BEGIN SELECT last_name INTO v_lname FROM employees WHERE first_name=John;DBMS_OUTPUT.PUT_LINE(Johns last name is:|v_lname);EXCEPTION WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE(Select statement found multiple rows);WHEN NO_DATA_
17、FOUND THEN DBMS_OUTPUT.PUT_LINE(Select statement found no rows);WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(Another type of error occurred);END;,捕获非预定义Oracle 服务错误,非预定义Oracle 异常和预定义异常类似;但在 PL/SQL 中没有预定义的名称.它们是标准Oracle 服务错误,有 ORA-错误编号.在 DECLARE 部分程序员自己为错误定义一个异常名,并使用 PRAGMA EXCEPTION_INIT 函数将其与ORA-错误编号关联在一起.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PLSQL 总结 异常 处理 嵌套
链接地址:https://www.31ppt.com/p-6514880.html