2017-09-20 11页 doc 314KB 30阅读
is_574951
暂无简介
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语句也出现了很多的错误,我们不仅需要查书本上的资料,还要筛选网上的各种信息,从大量的信息中选取合适的有用信息,更要和小组的组员相互讨论,如为什么会有这样的错误?怎样解决?等等。通过多种手段,我们的问题最终一一被解决,成功的完成了此次任务,我们不仅知识得到了一定的提升,而且动手能力得到了加强,我们知道了,所有的问题看上去很难,总以为自己完成不了,但是,只要努力的去做,通过各种途径寻找解决的,一点一点的解决,问题总会被解决,而问题被解决的那一刻,我们获得的成就感是无法用语言描述的。