資料庫實驗八 資料庫程式設計

Happy_change發表於2020-12-24

實驗八 資料庫程式設計

一、實驗目的

1.掌握資料庫PL/SQL程式語言,以及資料庫儲存過程的設計和使用方法。
2.掌握資料庫自定義函式的設計和使用方法。
3.掌握PL/SQL遊標的設計、定義和使用方法。

二、實驗內容和要求

1.儲存過程定義,儲存過程執行,儲存過程更名,儲存過程刪除,儲存過程的引數傳遞。,
2.自定義函式定義,自定義函式執行,自定義函式更名,自定義函式刪除,自定義函式的引數傳遞。
3.遊標定義、遊標使用。
按要求寫出相應的SQL語句。

三、實驗過程

(1)對學生-選課(s_t)資料庫,編寫儲存過程grade_info,統計某門課程的成績分佈情況,即分別統計出100分,90—99分,80—89分,70—79分,60—69分,小於60分的學生人數。儲存過程grade_info以課程名作為輸入引數。

delimiter //
create procedure grade_info(in course_name char(40))
begin
		declare p100, p90,p80,p70,p60,pbujige,grade int default 0;
		declare done int default false;
		declare cur cursor for
					select grade 
					from sc 
					where cno=( select cno
							  from course
							  where cname=course_name);
		declare continue handler for not found set done=TRUE;
		open cur;
		read_loop: loop
				fetch cur into grade;
				if done then
					leave read_loop;
				end if;
				if(grade=100)then
					SET p100= p100+1;
				elseif(grade>=90)then
					SET p90= p90+1;
				elseif(grade>=80)then
					SET p80=p80+1;
				elseif(grade>=70)  then
					SET p70=p70+1;
				elseif(grade>=60)  then
					set p60=p60+1;
				else set pbujige=pbujige+1;
				end if;
		end loop;
		close cur;
end;//
delimiter ;

(2)編寫函式course_avg,統計任意一門課程的平均分。函式course_avg以課程名為輸入引數,平均分為返回值。

delimiter //
create function course_avg(course_name char(40))
returns double
deterministic
begin
declare c_avg double;
select AVG(grade)
into c_avg
from sc
where sno in (select sno from course where cname=course_name);
return c_avg;
end;//
delimiter ;

(3)呼叫grade_info輸出“資料庫”課程的成績分佈情況。

call grade_info('資料庫');

(4)呼叫course_avg輸出“作業系統”課程的平均分。

select course_avg('作業系統');

(5)刪除grade_info。

 drop procedure grade_info;

(6)刪除course_avg。

drop function course_avg;

四、實驗總結
在做第一小題時,按照課本上的變數賦值語句寫的,一直報錯檢查了好久,最後一句句的定位錯誤發現賦值語句有問題,網上查詢關於mysql變數賦值的資料,發現mysql中的變數賦值不能用變數名:=表示式,在mysql中會報錯,在mysql中用Set 變數名=表示式。
使用call或select 加儲存過程/函式名都可用來呼叫儲存過程/函式
使用drop procedur/function 儲存過程名/函式名刪除儲存過程/函式

相關文章