MySQL數(shù)據(jù)庫實驗之?觸發(fā)器和存儲過程
觀前提示:本篇內(nèi)容為mysql數(shù)據(jù)庫實驗,代碼內(nèi)容經(jīng)測試過,可能一小部分有所疏漏,也有會不符合每個人實驗的要求的地方,因此以下內(nèi)容建議僅做思路參考。
一、實驗?zāi)康?/h2>
- 1、掌握某主流DBMS支持的SQL編程語言和編程規(guī)范,規(guī)范設(shè)計存儲過程;
- 2、能夠理解不同類型觸發(fā)器的作用和執(zhí)行原理,驗證觸發(fā)器的有效性;
- 3、培養(yǎng)學(xué)生的系統(tǒng)思維,提升解決復(fù)雜工程問題所需的編程能力。
二、實驗要求
掌握某主流DBMS的SQL編程語言,在前面創(chuàng)建的數(shù)據(jù)庫基礎(chǔ)上,定義BEFORE(for)觸發(fā)器和AFTER觸發(fā)器;掌握數(shù)據(jù)庫存儲過程定義、存儲過程運行,存儲過程更名,存儲過程刪除,存儲過程的參數(shù)傳遞。
溫馨提示:以下內(nèi)容均已經(jīng)過測試,不過難免會有疏漏,但是代碼實現(xiàn)大多數(shù)思路及實現(xiàn)經(jīng)測驗都是正確的。
三、實現(xiàn)內(nèi)容及步驟
1、創(chuàng)建一個不帶參數(shù)的簡單存儲過程
- (1)創(chuàng)建存儲過程sp_avggrade,實現(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)用該存儲過程,實現(xiàn)查詢。
call sp_avggrade();
2、創(chuàng)建一個帶輸入?yún)?shù)的存儲過程
(1)創(chuàng)建存儲過程sp_course_avggrade, 實現(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)建一個帶輸入輸出參數(shù)的存儲過程
(1)創(chuàng)建存儲過程sp_sdept _student,實現(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('計科',@num); SELECT @num AS '人數(shù)';
4、觸發(fā)器的創(chuàng)建與使用
(1)在學(xué)生表上創(chuàng)建觸發(fā)器,實現(xiàn)學(xué)生表中刪除學(xué)生記錄時,成績表中該學(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)驗證(1)、(2)中觸發(fā)器
驗證(1)
DELETE FROM student WHERE sno='201513';
驗證(2)
INSERT INTO sc(sno,cno,grade) VALUES('2002720','1',200);
四、實驗總結(jié)
- 1、通過本次實驗,對存儲過程和觸發(fā)器有了更深的認(rèn)識;
- 2、能夠理解不同類型觸發(fā)器的作用和執(zhí)行原理, 驗證了觸發(fā)器的有效性;
- 3、熟練掌握了數(shù)據(jù)庫存儲過程定義、存儲過程運行,存儲過程更名,存儲過程刪除,存儲過程的參數(shù)傳遞。
到此這篇關(guān)于MySQL數(shù)據(jù)庫實驗之 觸發(fā)器和存儲過程的文章就介紹到這了,更多相關(guān)MySQ存儲過程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL數(shù)據(jù)時區(qū)問題以及datetime和timestamp類型存儲的差異
這篇文章主要介紹了MySQL數(shù)據(jù)時區(qū)問題以及datetime和timestamp類型存儲的差異,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11mysql啟動失敗之mysql服務(wù)無法啟動(服務(wù)沒有報告任何錯誤)的解決方法
作為一名程序猿,必不可少的便是和mysql打交道,那當(dāng)mysql故障,服務(wù)無法啟動時該怎么解決呢,下面這篇文章主要給大家介紹了關(guān)于mysql啟動失敗之mysql服務(wù)無法啟動,服務(wù)沒有報告任何錯誤的解決方法,需要的朋友可以參考下2022-05-05