ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Oracle实验四 异常处理

2021-01-03 09:33:38  阅读:195  来源: 互联网

标签:C52 选课 where into 课程 实验 Oracle 异常 select


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;

标签:C52,选课,where,into,课程,实验,Oracle,异常,select
来源: https://blog.csdn.net/Airycho/article/details/112131291

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有