1. 程式人生 > 資料庫 >Oracle實驗四 異常處理

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;