實驗內容與完成情況(記錄所有的實驗過程): 1、對學生課程數據庫,編寫並執行三個存儲過程,分別完成下面功能: (1)統計某一門課的成績分佈情況,即用戶輸入某一門課程的名稱,就可統計出該課程各分數段分佈的人數。還要求寫出執行存儲過程的語句和執行結果。 (答題參考:1. 先建立一個表Rank用來存放存儲過程執行後的結果,其中第一列division顯示成績分段劃分,第二列sub_sum顯示的是成績在該分數段的學生人數。2. 存儲過程帶有一個字符型參數@name,用於接受,即用戶輸入某一門課程的名稱,就可統計出該課程各分數段分佈的人數。還要求寫出執行存儲過程的語句和執行結果。用戶輸入課程名稱,便於統計不同課程的分數分佈情況。3. 程序中應該判斷是否存在用戶輸入的課程名稱,如果不存在要向用戶提示:'輸入錯誤,沒有該課程!'。建議利用@@ROWCOUNT來判斷。) CREATE TABLE Rank( division CHAR(20), sub_sum INT);) select * from rank --存儲過程執行完後,rank表中存放的就是這門課程的成績分佈情況 division sub_sum -------------------- ----------- [0,60) 0 [60,70) 0 [70,80) 0 [80,90) 1 [90,100] 1
CREATE TABLE Rank( division char(20), sub_sum int ); INSERT INTO Rank(division) VALUES('[0,60)'),('[60,70)'),('[70,80)'),('[80,90)'),('[90,100]'); GO CREATE PROCEDURE printcourse @pcname char(20) AS DECLARE @pcno char(20),@pcount int UPDATE Course SET Cname=@pcname WHERE Cname=@pcname IF(@@ROWCOUNT=0) BEGIN RAISERROR('您輸入的課程號不存在,請重新輸入!', 16, 1) RETURN END SELECT @pcno=SC.cno FROM Course,SC WHERE Course.Cno=SC.Cno AND Course.Cname=@pcname SELECT @pcount=COUNT(*) FROM SC WHERE Grade<60 AND Cno=@pcno UPDATE Rank SET sub_sum=@pcount WHERE division='[0,60)'
SELECT @pcount=COUNT(*) FROM SC WHERE Grade>=60 AND Grade<70 AND Cno=@pcno UPDATE Rank SET sub_sum=@pcount WHERE division='[60,70)'
SELECT @pcount=COUNT(*) FROM SC WHERE Grade>=70 AND Grade<80 AND Cno=@pcno UPDATE Rank SET sub_sum=@pcount WHERE division='[70,80)'
SELECT @pcount=COUNT(*) FROM SC WHERE Grade>=80 AND Grade<90 AND Cno=@pcno UPDATE Rank SET sub_sum=@pcount WHERE division='[80,90)'
SELECT @pcount=COUNT(*) FROM SC WHERE Grade>=90 AND Grade<=100 AND Cno=@pcno UPDATE Rank SET sub_sum=@pcount WHERE division='[90,100]'
EXEC printcourse '數據庫' SELECT * FROM Rank
(2)統計某一門課的平均成績。(建議:存儲過程可帶有一個字符型參數值,接受用戶輸入的課程名稱,一個輸出參數[用output聲明]用於存放返回給調用者的這門課程的平均成績)。還要求寫出執行存儲過程的語句和執行結果。 執行結果形爲: 數學課的平均成績爲:82.0 CREATE PROCEDURE printavg_course @pcname char(20),@pavg int output AS DECLARE @pcno char(20) UPDATE Course SET Cname=@pcname WHERE Cname=@pcname IF(@@ROWCOUNT=0) BEGIN RAISERROR('您輸入的課程號不存在,請重新輸入!', 16, 1) RETURN END SELECT @pcno=SC.cno FROM Course,SC WHERE Course.Cno=SC.Cno AND Course.Cname=@pcname SELECT @pavg=AVG(SC.Grade) FROM SC WHERE Cno=@pcno PRINT RTrim(@pcname)+'的平均成績爲:'+CAST(@pavg AS char(5)) GO DECLARE @pavg int EXEC printavg_course '數據庫',@pavg output (3)附加題:將學生選課成績從百分制改爲等級制(即A、B、C、D、E五級)。 執行結果形如: sno cno Grade Classified grade --------- ---- ---------------- ---------- 200215121 4 成績爲空! NULL 200215121 6 成績爲空! NULL 200215121 7 成績爲空! NULL 200215122 5 成績爲空! NULL 200215125 1 成績爲空! NULL 200215126 6 不及格 55 200215122 2 良 80 200215121 2 良 85 200215121 3 良 88 200215121 1 優 92 200215122 1 優 92
(11 行受影響) CREATE PROCEDURE printclass_grade AS SELECT Sno,Cno,Grade, CASE WHEN Grade<60 THEN '不及格' WHEN Grade>=60 AND Grade<70 THEN '及格' WHEN Grade>=70 AND Grade<80 THEN '中' WHEN Grade>=80 AND Grade<90 THEN '良' WHEN Grade>=90 AND Grade<=100 THEN '優' ELSE '成績爲空!' END AS 'Grade Classified' FROM SC EXEC printclass_grade 2、對SPJ數據庫,創建一個存儲過程ins_s_count,功能爲根據提供的供應商號,供應商名,供應商所在地等信息,往S表中插入數據,並返回插入該記錄之後,S表中的記錄數。調用該存儲過程實現往S表中插入一條記錄(‘S6’,’天盛’,‘福州’),並顯示插入該記錄之後,S表中的記錄數。 CREATE PROCEDURE ins_s_count @psno char(20),@psname char(20),@pstatus int,@pcity char(20) AS DECLARE @pcount int INSERT INTO S(SNO,SNAME,STATUS,CITY) VALUES(@psno,@psname,@pstatus,@pcity) SELECT @pcount=COUNT(*) FROM S PRINT 'S表中的記錄數:'+CAST(@pcount AS char(5))
EXEC ins_s_count 'S6','天盛',35,'福州' 3、查看存儲過程的定義和內容 (1)定義 存儲過程(Stored Procedure) 是存儲在服務器上的 Transact-SQL 語句的命名集合 是封裝重複性任務的方法 支持用戶聲明變量、條件執行以及其他強有力的編程特性 (2)內容 存儲過程與其他編程語言中的過程類似,它可以 包含執行數據庫操作(包括調用其他過程)的編程語句 接受輸入參數 向調用過程或批處理返回狀態值,以表明成功或失敗(以及失敗原因) 以輸出參數的形式將多個值返回至調用過程或批處理 |
實驗七: 存儲過程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.