Oracle實驗四 異常處理
阿新 • • 發佈:2021-01-03
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;