为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

异常处理

2017-09-20 11页 doc 314KB 30阅读

用户头像

is_574951

暂无简介

举报
异常处理                                                     课 程 设 计 课程名:高级数据库应用                             项目名:异常处理          学院:信息科学与工程学院          专业:计算机科学与技术          班级:计算机111          组员: 学号:1105010105 姓名:刘志禹 学号:1105010108 姓名:任敏 学号:1105010126 姓名:刘琴          指导老师:任树华   ...
异常处理
                                                     课 程 设 计 课程名:高级数据库应用                             项目名:异常处理          学院:信息科学与工程学院          专业:计算机科学与技术          班级:计算机111          组员: 学号:1105010105 姓名:刘志禹 学号:1105010108 姓名:任敏 学号:1105010126 姓名:刘琴          指导老师:任树华          日期:2014年5月18日     异常处理 一:异常处理的概述: 即使是写得最好的PL/SQL程序也会遇到错误或未预料到的事件。一个优秀的程序都应该能够正确处理各种出错情况,并尽可能从错误中恢复。任何ORACLE错误(为ORA-xxxxx形式的Oracle错误号)、PL/SQL运行错误或用户定义条件(不一写是错误),都可以。当然了,PL/SQL编译错误不能通过PL/SQL异常处理来处理,因为这些错误发生在PL/SQL程序执行之前。 ORACLE 提供异常情况(EXCEPTION)和异常处理(EXCEPTION HANDLER)来实现错误处理。异常情况处理(EXCEPTION)是用来处理正常执行过程中未预料的事件,程序块的异常处理预定义的错误和自定义错误,由于PL/SQL程序块一旦产生异常而没有指出如何处理时,程序就会自动终止整个程序运行. 有三种类型的异常错误:     1. 预定义 ( Predefined )错误   ORACLE预定义的异常情况大约有24个。对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发。     2. 非预定义 ( Predefined )错误    即其他的ORACLE错误。对这种异常情况的处理,需要用户在程序中定义,然后由ORACLE自动将其引发。     3. 用户定义(User_define) 错误  程序执行过程中,出现编程人员认为的非正常情况。对这种异常情况的处理,需要用户在程序中定义,然后显式地在程序中将其引发。  异常处理部分一般放在 PL/SQL 程序体的后半部,结构为: EXCEPTION    WHEN first_exception THEN      WHEN second_exception THEN      WHEN OTHERS THEN   END;  异常处理可以按任意次序排列,但 OTHERS 必须放在最后。OTHERS 表示在异常处理未出现的其他异常情况。最多只能有一个WHEN OTHERS子句;在块中开始一个出错处理部分必须以关键字 EXCEPTION开始。 二:课程设计要求 1.基本要求: (1)在项目选项中任选其一项目。 (2)人员:可自由组合,最多2~3人为一组.每个组不要重复。 2.项目要求: 请分别举例说明下列四种异常处理的使用: (1)Oracle预定义的异常处理。 (2)非预定义的Oracle异常。 (3)用户自定义的异常。 (4) raise_application_error过程。     Requirement: Write the principle and detailed procedures/steps, add the necessary illustration and screen copy using screen coping software.  Shrinking graph size in the report. Your full name and Email should be on the header of your report and the file name should be given as following format: yourname_project_no.pdf Please commit your report in a hard copy. (A4 paper:top:1.6cm,bottom:1.6cm,right:1.6cm,left:1.6cm) If you cannot complete the project before the deadline , you get 0 marks. Every student should compete the project by yourself. Copy not allowed. 三:课程设计主要内容: (一)实验准备: (1)本次实验的运行环境是Oracle9i (2)用户myuser下事先创建有表db_college,db_major,db_student,db_teacher,db_course,db_teach_course,db_grade七个表并且插入了相应的数据,表结构及数据分别如图所示。     图1  七个表概况                       图2 db_college表结构及数据                           图3 db_major表结构及数据     图4 db_teacher表结构及数据     图5 db_course表结构及数据     图6 db_teach_course表结构及数据     图7 db_student表结构及数据                                             图8 db_grade表结构及数据 (二)实验操作步骤: (1)Oracle预定义的异常处理: 在异常处理中,Oracle提供了两个系统函数SQLCODE和SQLERRM,用以获取异常代码和完整的错误提示信息。对系统内部预定义异常提供SQLLCODE返回一个oracle错误编号除了NO_DATA_FOUND是正常值,其余均为负值。SQLERRM用于返回对应的错误信息。对用户定义的异常,SQLCODE返回+1,而且SQLERRM返回“用户定义异常”;若没有异常发生,操作正常执行,则SQLCODE返回0,SQLERRM返回信息“ORA-0000:正常,成功完成”。 案例1:按学号查学生信息,有此人返回信息,无此人则返回“无此人”。 创建NO_DATA_FOUND代码如下: create or replace function func_query_std_inf ( v_reg_no db_student.register_no%type) return char is v_major_no db_student.major_no%type; begin select major_no into v_major_no from db_student where register_no=v_reg_no; return v_major_no; exception when no_data_found then return '无此人'; end func_query_std_inf; 数据进行测试: select func_query_std_inf('0102') from dual; 图9 创建NO_DATA_FOUND及测试结果1 select func_query_std_inf('12345678912') from dual; 图10 创建NO_DATA_FOUND及测试结果2 案例2:输入学院号,查询college_name,错误返回信息“变量长度不足”。 Value_erro代码如下: set serveroutput on declare v_college_name varchar2(2); v_college_no db_college.college_no%type; begin v_college_no:= '10'; select college_name into v_college_name from db_college where college_no=v_college_no; dbms_output.put_line(v_college_name); exception     when value_error then     dbms_output.put_line('变量长度不足'); end;     图11 Value_erro及测试结果 (2)非预定义的Oracle异常 对于这类异常情况的处理,首先必须对非定义的ORACLE错误进行定义。步骤如下: 1. 在PL/SQL 块的定义部分定义异常情况: 格式: < EXCEPTION_NAME>  EXCEPTION; 2. 将其定义好的异常情况,与标准的ORACLE错误联系起来,使用EXCEPTION_INIT语句: PRAGMA EXCEPTION_INIT(<异常情况>, <错误代码>);  3. 在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理。  在pl/sql中,PRAGMA EXCEPTION_INIT由于编译器将一个Oracle错误编号与异常名字建立关联。PRAGMA也称为伪指令,是关键词,表示该语句是直接编译器,它是的pl/sql编译器发生在块内与Oracle错误编号相关联的所有异常。 案例3:删除指定院系的记录信息,以确保该院系没有学生。 代码如下: set serveroutput on; declare     v_collegeno db_college.college_no%type; collegeno_remaining exception; pragma exception_init(collegeno_remaining,-2292);          begin delete from db_college where college_no='01'; exception     when collegeno_remaining then     dbms_output.put_line('违反数据完整性约束!');     when others then     dbms_output.put_line(SQLCODE||'---'||SQLERRM); end;// -2290是违反一致性约束的错误代码     图12  删除院系记录非预定义异常处理 (3)用户自定义的异常 当与一个异常错误相关的错误出现时,就会隐含触发该异常错误。用户定义的异常错误是通过显式使用 RAISE 语句来触发。当引发一个异常错误时,控制就转向到 EXCEPTION块异常错误部分,执行错误处理代码。  对于这类异常情况的处理,步骤如下: 1. 在PL/SQL 块的定义部分定义异常情况:  <异常情况>  EXCEPTION;  2. RAISE <异常情况>; raise ; 3. 在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理。  案例4:查找指定学生信息的异常处理。 代码如下: set serveroutput on Declare v_register_no db_student.register_no%type:= '111111111111'; v_tele db_student.s_tele%type; a exception; begin select s_tele into v_tele from db_student where register_no = v_register_no; if sql%notfound then     raise a; end if; exception     when a then     dbms_output.put_line('其他错误!');     when others then     dbms_output.put_line('违背唯一性约束'); end;                     图13 查找学生信息用户自定义异常处理 案例5:删除指定学生信息,无该生时的异常处理。 代码如下: set serveroutput on declare v_sno db_student.register_no%type:='111111111111'; not_found exception; begin delete db_student where register_no=v_sno; if sql%notfound then raise not_found; end if; exception when not_found then dbms_output.put_line('无法删除学号为:'||v_sno||'的学生,该生不存在,请退出!'); when others then dbms_output.put_line('其他错误'); end; /                               图14 删除学生信息的用户自定义异常处理 (4) raise_application_error过程 如果用户需要在程序中自定义格式ora—的错误信息,则必须使用oracle提供的标准包dbms_standard中所定义的raise_application_error过程重新定义异常错误消息。它为应用程序提供了一种与Oracle交互的方法,使用raise_application_error时,可不必在其边加dbms_standard RAISE_APPLICATION_ERROR 的语法如下: RAISE_APPLICATION_ERROR(error_number,error_message,[keep_errors] ); 这里的error_number 是从 –20,000 到 –20,999 之间的参数,      error_message 是相应的提示信息(< 2048 字节), keep_errors 为可选,如果keep_errors =TRUE ,则新错误将被添加到已经引发的错误列表中。如果keep_errors=FALSE(缺省),则新错误将替换当前的错误列表。  案例六:查找指定学生信息的异常处理用raise_application_erro实现。 代码如下: set serveroutput on declare v_sno db_student.register_no%type:='111111111111'; v_tele db_student.s_tele%type; begin select s_tele into v_tele from db_student where register_no=v_sno; dbms_output.put_line(v_tele); exception when others then raise_application_error(-20001,'学号'||v_sno||'的学生,该生不存在,请退出!'); end; /     图15 删除学生信息raise_application_erro的异常处理 总结:学习Oracle课程快一个学期了,这次的课程设计让我们收获颇丰,为了更好完成这次任务,我们系统的整理了所学的知识,以前学的东西都是零星的碎片,通过这次作业,我们把这些碎片整理成了一个整体,完成的过程中遇到了很多的困难,执行SQL语句也出现了很多的错误,我们不仅需要查书本上的资料,还要筛选网上的各种信息,从大量的信息中选取合适的有用信息,更要和小组的组员相互讨论,如为什么会有这样的错误?怎样解决?等等。通过多种手段,我们的问题最终一一被解决,成功的完成了此次任务,我们不仅知识得到了一定的提升,而且动手能力得到了加强,我们知道了,所有的问题看上去很难,总以为自己完成不了,但是,只要努力的去做,通过各种途径寻找解决的,一点一点的解决,问题总会被解决,而问题被解决的那一刻,我们获得的成就感是无法用语言描述的。
/
本文档为【异常处理】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索