第五讲异常处理(精)_第1页
第五讲异常处理(精)_第2页
第五讲异常处理(精)_第3页
第五讲异常处理(精)_第4页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、PL/SQL 程序设计教案第五讲 异常处理本讲主要内容:1、 什么是异常?2、 PL/SQL 预定义异常3、 PL/SQL 的异常处理结构4、 PL/SQL 自定义异常1、 什么是异常一个 PL/SQL 程序在运行的时候可能会发生很多的错误。这些错误可能来自设计的缺陷、编码错误、硬件故障或其他别的方面的原因。虽然不能预期所有可能发生的错误,但是可以在我们的 PL/SQL 程序中有计划地截获和处理特定的几种主要错误。ORACLE 中出现的错误情形有:编译时刻的错误和运行时刻的错误(通常指所说的异常)。当一个错误发生的时候,一个异常被引发,正常的执行被停止,控制转而交到 PL/SQL 块或子程序中

2、的异常处理部分。异常部分的语法:ExceptionWhen exception_name1 then-When exception_name2 then-When others then-程序例子:create or replace procedure error_hande(x number,y number,z out number)asbeginz:=x/y;exceptionwhen zero_divide thendbms_output.put_line(不能被 0 除! );z:=-1; end;2、 PL/SQL 预定义异常PL/SQL 为一些 ORACLE 公共错误进行了预定义

3、异常。如 select .into 中国矿业大学应用技术学院 版权所有 1PL/SQL 程序设计教案没有检索到数据时候, PL/SQL 就会触发 no_data_found异常。 预定义异常的使用例子create or replace procedure test_error(v_sno temp.sno%type)asv_sname temp.sname%type;beginselect sname into v_sname from tempwhere sno=v_sno;dbms_output.put_line(v_sname);exceptionwhen no_data_found t

4、hendbms_output.put_line(no data found);when too_many_rows thendbms_output.put_line(many rows found);end test_error;3、 PL/SQL 自定义异常PL/SQL 可以让用户定义异常。和预定义异常不同的是,用户自定义异常必须要申明,并且必须用 RAISE 语句显式地触发。异常不一定是一个错误,可能是针对一个特定情况进行的处理。预定义异常一般都和 ORACLE 的错误相对应。1) . 定义异常处理定义异常处理的语法如下:declare异常名 exception;2) . 触发异常处理触发

5、异常处理的语法如下:raise 异常名 ;3) . 处理异常触发异常处理后,可以定义异常处理部分,语法如下:ExceptionWhen 异常名 1 then异常处理语句段1;When 异常名 2 then异常处理语句段2;中国矿业大学应用技术学院版权所有 2PL/SQL 程序设计教案自定义异常例子1 declare2 my_exception exception;3 s integer;4 begin5 select count(*) into s from tb_student;6 if s=1 then7 raise my_exception;8 end if;9 exception10

6、when my_exception then11 dbms_output.put_line(find);12* end;SQL /Find4、 PL/SQL 的异常处理结构1)异常的触发DECLAREexception_name EXCEPTION; -在这里预定义异常BEGIN.IF CONDITION THENRAISE exception_name; -在这里触发异常ELSE.END IF;EXCEPTIONWHEN exception_name THEN -控制被转到异常处理部分,这里的代码被执行ERROR-PROCESSING STATEMENTS;END;2)异常的传播异常可能出现

7、在ORACLE 块的申明、执行和异常部分。A 执行部分触发的异常处理顺序:如果当前块中含有异常处理部分并且设置了异常处理器,则会执行该处理器完成该块的执行,然后将控制交给包含块。如果没有包含块,则会将控制权交给外部块,如果没有外部块则是交到当前的调用环境。如果当前块中没有包含异常部分,就会寻找包含块中有没有异常处理器,如果有则执行该异常处理器后将控制权交给外部块中,如果没有则会到外中国矿业大学应用技术学院 版权所有 3PL/SQL 程序设计教案部块中寻找,如果没有将控制权交到调用环境。DECLAREEXCEPTION_A EXCEPTION;BEGIN-DO STHBEGINRAISE EXC

8、EPTION_A;EXCEPTIONWHEN EXCEPTION_A THEN-DO STHEND;END;(异常处理在当前块中)DECLAREA_EXCEP EXCEPTION;B_EXCEP EXCEPTION;BEGINBEGINRAISE A_EXCEP;EXCEPTIONWHEN B_EXCEP THEN-END;EXCEPTIONWHEN A_EXCEP THEN-END;(异常处理不在当前块中)declareexcep_a exception;excep_b exception;excep_c exception;begin-beginraise excep_a;exceptio

9、n中国矿业大学应用技术学院版权所有 4PL/SQL 程序设计教案when excep_b then-end;exceptionwhen execp_c then-End;(当前块和外部块都没有异常处理部分)B申明部分触发的异常申明部分触发的异常一般都是由赋值操作引起的异常。当触发一个在申明部分的异常时,当前块的异常处理对它是不起作用的,一般它被传播到包含当前块的外部块中再进行处理。declaren_number number:=a string;begindbms_output.put_line(n_number);exceptionwhen others thendbms_output.pu

10、t_line(this is a error);end;begindeclaren_number number:=a string;begindbms_output.put_line(n_number);exceptionwhen others thendbms_output.put_line(this is a error);end;exceptionwhen others thendbms_output.put_line(只有这里起作用 );end;c异常处理部分触发的异常异常处理器中的异常不能在当前块中得到处理,只有在外部块中才能得到处理或者将控制权交到调用环境。无法执行:declare

11、中国矿业大学应用技术学院版权所有 5PL/SQL 程序设计教案a_exception exception;b_exception exception;beginraise a_exception;exceptionwhen a_exception thenraise b_exception;when b_exception thendbms_output.put_line( b_exception被触发 );end;异常执行:declarea_exception exception;b_exception exception;beginbeginraise a_exception;except

12、ionwhen a_exception thenraise b_exception;when b_exception thendbms_output.put_line( b_exception不被触发 ); end; exceptionwhen b_exception thendbms_output.put_line( b_exception被触发 );end;异常使用例子,更新数据异常create or replace procedure test_error(v_sno temp.sno%type,v_sname temp.sname%type) asmy_exception except

13、ion;my_exceptionb exception;beginupdate tempset sname=v_snamewhere sno=v_sno;if sql%notfound thenraise my_exception;中国矿业大学应用技术学院版权所有 6PL/SQL 程序设计教案elseraise my_exceptionb;end if;exceptionwhen my_exception thendbms_output.put_line(not found);when my_exceptionb thendbms_output.put_line(success);end te

14、st_error;sqlcode and sqlerrm的使用create or replace procedure test1_error(v_sno temp.sno%type)asv_sname temp.sname%type;v_code number;v_msg varchar2(512);beginselect sname into v_sname from tempwhere sno=v_sno;dbms_output.put_line(v_sname);exceptionwhen no_data_found thenv_code:=sqlcode;v_msg:=sqlerrm;

15、dbms_output.put_line( exception code is |v_code| exception msg is |v_msg);-dbms_output.put_line(no_data_found);when too_many_rows thenv_code:=sqlcode;v_msg:=sqlerrm;dbms_output.put_line( exception code is |v_code| exception msg is |v_msg);-dbms_output.put_line(too_many_rows);when others thenv_code:=

16、sqlcode;v_msg:=sqlerrm;dbms_output.put_line( exception code is |v_code| exception msg is |v_msg);-dbms_output.put_line(others);中国矿业大学应用技术学院版权所有 7PL/SQL 程序设计教案End;示例 3:create or replace procedure test2_error(v_sno temp.sno%type)asv_sname temp.sname%type;s integer;my_exception1 exception;my_exception2 exception;beginselect count(*) into s from

温馨提示

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

评论

0/150

提交评论