MySQL數(shù)據(jù)庫實(shí)驗(yàn)之?觸發(fā)器和存儲過程
觀前提示:本篇內(nèi)容為mysql數(shù)據(jù)庫實(shí)驗(yàn),代碼內(nèi)容經(jīng)測試過,可能一小部分有所疏漏,也有會不符合每個(gè)人實(shí)驗(yàn)的要求的地方,因此以下內(nèi)容建議僅做思路參考。
一、實(shí)驗(yàn)?zāi)康?/h2>
- 1、掌握某主流DBMS支持的SQL編程語言和編程規(guī)范,規(guī)范設(shè)計(jì)存儲過程;
- 2、能夠理解不同類型觸發(fā)器的作用和執(zhí)行原理,驗(yàn)證觸發(fā)器的有效性;
- 3、培養(yǎng)學(xué)生的系統(tǒng)思維,提升解決復(fù)雜工程問題所需的編程能力。
二、實(shí)驗(yàn)要求
掌握某主流DBMS的SQL編程語言,在前面創(chuàng)建的數(shù)據(jù)庫基礎(chǔ)上,定義BEFORE(for)觸發(fā)器和AFTER觸發(fā)器;掌握數(shù)據(jù)庫存儲過程定義、存儲過程運(yùn)行,存儲過程更名,存儲過程刪除,存儲過程的參數(shù)傳遞。
溫馨提示:以下內(nèi)容均已經(jīng)過測試,不過難免會有疏漏,但是代碼實(shí)現(xiàn)大多數(shù)思路及實(shí)現(xiàn)經(jīng)測驗(yàn)都是正確的。
三、實(shí)現(xiàn)內(nèi)容及步驟
1、創(chuàng)建一個(gè)不帶參數(shù)的簡單存儲過程
- (1)創(chuàng)建存儲過程sp_avggrade,實(shí)現(xiàn)查詢每門課程學(xué)生的平均成績的功能;
delimiter// CREATE PROCEDURE sp_avggrade() COMMENT '查詢每門課程學(xué)生的平均成績的功能' BEGIN SELECT cno as 課程號,avg(grade)as 平均成績 FROM sc GROUP BY cno; end// delimiter;
(2)調(diào)用該存儲過程,實(shí)現(xiàn)查詢。
call sp_avggrade();
2、創(chuàng)建一個(gè)帶輸入?yún)?shù)的存儲過程
(1)創(chuàng)建存儲過程sp_course_avggrade, 實(shí)現(xiàn)通過輸入課程編號參數(shù)查詢指定課程編號的課程平均成績的功能;
delimiter// CREATE PROCEDURE sp_course_avggrade(IN c_no CHAR(2)) COMMENT '通過輸入課程編號參數(shù)查詢指定課程編號的課程平均成績的功能' BEGIN SELECT cno,AVG(grade) FROM sc WHERE cno=c_no; END// delimiter;
(2)調(diào)用該存儲過程,獲取指定課程的平均成績。
3、創(chuàng)建一個(gè)帶輸入輸出參數(shù)的存儲過程
(1)創(chuàng)建存儲過程sp_sdept _student,實(shí)現(xiàn)根據(jù)用戶輸入的院系編號參數(shù),查找該學(xué)院的學(xué)生人數(shù),并以變量形式輸出的功能;
delimiter// CREATE PROCEDURE sp_sdept_student2(IN _sdept CHAR(10),OUT num int) BEGIN SELECT COUNT(sno) INTO num FROM student WHERE _sdept = sdept; END// delimiter;
(2)調(diào)用該存儲過程,以返回變量的形式獲取相應(yīng)院系的學(xué)生人數(shù)。
SET @num=10; CALL sp_sdept_student2('計(jì)科',@num); SELECT @num AS '人數(shù)';
4、觸發(fā)器的創(chuàng)建與使用
(1)在學(xué)生表上創(chuàng)建觸發(fā)器,實(shí)現(xiàn)學(xué)生表中刪除學(xué)生記錄時(shí),成績表中該學(xué)生成績記錄的級聯(lián)刪除;
delimiter// CREATE TRIGGER delete_stu BEFORE DELETE ON student FOR EACH ROW BEGIN DELETE FROM sc WHERE sc.sno=old.sno; END// delimiter;
(2)在選課表上創(chuàng)建觸發(fā)器,若錄入的成績大于100分,小于0分,則拒絕插入記錄并顯示;
delimiter// CREATE TRIGGER scgrade BEFORE INSERT ON sc FOR EACH ROW BEGIN IF new.grade>100 or new.grade < 0 THEN SIGNAL SQLSTATE '45000' SET message_text='錄入成績不符合規(guī)定,拒絕插入'; END IF; END// delimiter;
(3)驗(yàn)證(1)、(2)中觸發(fā)器
驗(yàn)證(1)
DELETE FROM student WHERE sno='201513';
驗(yàn)證(2)
INSERT INTO sc(sno,cno,grade) VALUES('2002720','1',200);
四、實(shí)驗(yàn)總結(jié)
- 1、通過本次實(shí)驗(yàn),對存儲過程和觸發(fā)器有了更深的認(rèn)識;
- 2、能夠理解不同類型觸發(fā)器的作用和執(zhí)行原理, 驗(yàn)證了觸發(fā)器的有效性;
- 3、熟練掌握了數(shù)據(jù)庫存儲過程定義、存儲過程運(yùn)行,存儲過程更名,存儲過程刪除,存儲過程的參數(shù)傳遞。
到此這篇關(guān)于MySQL數(shù)據(jù)庫實(shí)驗(yàn)之 觸發(fā)器和存儲過程的文章就介紹到這了,更多相關(guān)MySQ存儲過程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
wamp中mysql安裝時(shí)能啟動(dòng)重啟后無法啟動(dòng)的解決辦法
這篇文章主要介紹了wamp中mysql安裝時(shí)能啟動(dòng)重啟后無法啟動(dòng)的解決辦法 ,需要的朋友可以參考下2018-08-08MySQL數(shù)據(jù)時(shí)區(qū)問題以及datetime和timestamp類型存儲的差異
這篇文章主要介紹了MySQL數(shù)據(jù)時(shí)區(qū)問題以及datetime和timestamp類型存儲的差異,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11mysql啟動(dòng)失敗之mysql服務(wù)無法啟動(dòng)(服務(wù)沒有報(bào)告任何錯(cuò)誤)的解決方法
作為一名程序猿,必不可少的便是和mysql打交道,那當(dāng)mysql故障,服務(wù)無法啟動(dòng)時(shí)該怎么解決呢,下面這篇文章主要給大家介紹了關(guān)于mysql啟動(dòng)失敗之mysql服務(wù)無法啟動(dòng),服務(wù)沒有報(bào)告任何錯(cuò)誤的解決方法,需要的朋友可以參考下2022-05-05