Oracle实验四 异常处理

Oracle实验四 异常处理

第1关:异常处理

1、查询‘111’号同学的姓名,使用异常判断,若没有这个同学,则添加一条学号为‘111’的学生信息,姓名为‘张三’,其他属性为空,并输出:‘111’号同学已被成功添加。

   若存在该同学,则输出(冒号为中文状态下的冒号):
       111号同学的姓名:查询出的姓名
   若不存在该同学,则输出:
       111号同学已被成功添加。
declare
vsname varchar(20);
begin
select sname into vsname from Student where sno='111';
dbms_output.put_line('111号同学的姓名:'||vsname);
exception when no_data_found then
insert into Student(sno,sname) values('111','张三');
dbms_output.put_line('111号同学已被成功添加。');
commit;
end;

2、打印‘C50’号课程的当前选课人数和最大选课人数(Snumber)。若出现异常,则判断C50号课程是否存在,若不存在,则添加C50课程(’C50’,’NewCourse’,null,3,100),再让001号同学和003号同学选修C50号课程,成绩分别为80分和90分,最后打印C50号课程的当前选课人数和最大选课人数。打印格式如下:

若C50存在,则打印格式如下(其中的逗号和冒号是中文状态下的):
   (查询出的C50的课程名)课程当前选课人数:(查出来的人数),最大选课人数:(查出来的最大人数)
   如:DB课程当前选课人数:80,最大选课人数:100
若C50不存在,则打印格式(其中的逗号和冒号是中文状态下的):
   添加NewCourse课程成功,课程当前选课人数:(查出来的人数),最大选课人数:(查出来的最大人数)
   如:添加NewCourse课程成功,课程当前选课人数:10,最大选课人数:100
declare
vcname varchar(20);
cnt smallint;
vsnumber int;
begin
select count(sno) into cnt from SC where cno='C50';
select snumber,cname into vsnumber,vcname from Course where cno='C50';
dbms_output.put_line(vcname||'课程当前选课人数:'||cnt||',最大选课人数:'||vsnumber);
exception when no_data_found then
insert into Course(cno,cname,ccredit,snumber) values('C50','NewCourse','3','100');
insert into SC values('001','C50',80);
insert into SC values('003','C50',90);
commit;
select count(sno) into cnt from SC where cno='C50';
select snumber,cname into vsnumber,vcname from Course where cno='C50';
dbms_output.put_line(' 添加NewCourse课程成功,课程当前选课人数:'||cnt||',最大选课人数:'||vsnumber);
end;

第2关:异常处理之嵌套块

1、为English系年龄最大的同学选C52课程,并打印选课结果和该同学的选课数,若该生已经选择了C52课程,则打印该生的平均分。使用嵌套块中的异常判断,若没有English系,则将Student表中的E系修改为English系,并打印:已成功将E系修改为English系,然后退出程序。若没有C52课程,请添加C52课程(’C52’,’NC’,null,2,100)并打印:C52课程添加成功,然后退出程序。

注意:该程序要成功执行的前提是English系的最大年龄对应的同学只能有一个。若在你们自己的系统下测试,请通过修改数据确保这个前提条件。
测试规则:底层将通过调用四次程序,查看程序输出是否正确。
(1)若学生和课程都存在,则为其选课,并输出(冒号为中文状态下的冒号):
已为(查询出的姓名)同学选择了课程(查询出来的课程名),该同学的选课门数为:(查询出的选课门数)
如:已为张三同学选择了课程DB,该同学的选课门数为:10
(2)若该生已经选择了课程C52,则输出:
(查询出的姓名)同学的平均成绩为:(查询出的平均分)
如:张三同学的平均成绩为:85
(3)若系别不存在,则修改数据后,输出:
已成功将E系修改为English系
(4)若课程不存在,则添加数据后,输出:
C52课程添加成
两种写法,比较差异

declare
vsname varchar(20);
vgrade SC.grade%type;
vsno char(10);
cnt int;
scnt int;
vcnt int;
vcname varchar(20);
begin
select sno into vsno from Student where sdept='English' and sage>=all(select sage from Student where sdept='English');
select sname into vsname from Student where sno=vsno;
	begin
	select count(*),cname into cnt,vcname from Course where cno='C52' group by cname;
		begin
		select count(*) into scnt from SC where sno=vsno and cno='C52';
		if(scnt>0) then
		select avg(grade) into vgrade from SC where sno=vsno;
		dbms_output.put_line(vsname||'同学的平均成绩为:'||vgrade);
		else 
		insert into SC(sno,cno) values(vsno,'C52');
		select count(*) into vcnt from SC where sno=vsno;
		dbms_output.put_line('已为'||vsname||'同学选择了课程'||vcname||',该同学的选课门数为:'||vcnt);
		commit;
        end if;
		end;
	exception when no_data_found then
	insert into Course values('C52','NC',null,2,100);
	commit;
	dbms_output.put_line(' C52课程添加成功');
	end;
exception when no_data_found then
update Student set sdept='English' where sdept='E';
commit;
dbms_output.put_line(' 已成功将E系修改为English系');
end;
declare
    avgrade smallint;
    vsno char(10);
    vcname varchar(20);
    vsname varchar(20);
    vcount smallint;
begin
    select sno,sname into vsno,vsname from student where sage=(select max(sage) from student where sdept='English') and sdept='English';
    begin
        select cname into vcname from course where cno='C52'; 
        insert into sc values(vsno,'C52',null);
        select count(*) into vcount from sc where sno=vsno;
        commit;
        dbms_output.put_line('已为'||vsname||'同学选择了课程'||vcname||',该同学的选课门数为:'||vcount);
        exception 
            when NO_DATA_FOUND then
                insert into course values('C52','NC',null,2,100);
                commit;
                dbms_output.put_line('C52课程添加成功');
            when dup_val_on_index then
                select avg(grade) into avgrade from sc where sno=vsno;
                dbms_output.put_line(vsname||'同学的平均成绩为:'||avgrade);

    end;
    exception when NO_DATA_FOUND then
        update student set sdept='English' where sdept='E';
        commit;
        dbms_output.put_line('已成功将E系修改为English系'); 
end;
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值