實驗七: 存儲過程

實驗內容與完成情況(記錄所有的實驗過程):

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)內容

存儲過程與其他編程語言中的過程類似,它可以

包含執行數據庫操作(包括調用其他過程)的編程語句

接受輸入參數

向調用過程或批處理返回狀態值,以表明成功或失敗(以及失敗原因)

以輸出參數的形式將多個值返回至調用過程或批處理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章