【正文】
屬性值 , 在完成插入操作前 , 進行檢查是否滿足實體完整性和參照完整性 , 確保不重復選修某門課程 , 并返回狀態(tài)值 。 187。35 USE 教學管理 GO IF EXISTS(SELECT name FROM sysobjects WHERE name = 39。P_檢查學分登記 39。 AND type = 39。P39。) DROP PROCEDURE P_檢查學分登記 GO 創(chuàng)建存儲過程 CREATE PROCEDURE P_檢查學分登記 (@所在院系 CHAR(20)) AS BEGIN IF @所在院系 IS NULL RETURN 1 IF NOT EXISTS(SELECT * FROM 學生表 WHERE 所在院系 =@所在院系 ) RETURN 2 187。36 DECLARE @學號 CHAR(7), @姓名 CHAR(10), @累計學分 INT DECLARE @課號 CHAR(6),@課名 CHAR(20),@成績 FLOAT,@學分 INT DECLARE @message CHAR(80) 創(chuàng)建包含每個學生學號 、 姓名和所獲取學分信息的游標 P_檢查學分登記 _cur DECLARE P_檢查學分登記 _cur CURSOR FOR SELECT 學號 ,姓名 ,累計學分 FROM 學生表 WHERE 所在院系 =@所在院系 FOR UPDATE OF 累計學分 187。37 打開游標 , 提取第一個學生的數(shù)據(jù) OPEN P_檢查學分登記 _cur FETCH NEXT FROM P_檢查學分登記 _cur INTO @學號 , @姓名 ,@累計學分 WHILE @@fetch_status=0 BEGIN 顯示學生學號 、 姓名 SELECT @message=@學號 +39。 39。+ @姓名 PRINT @message 定義當前學生所選課程及成績的游標計算累計學分 _cur DECLARE 計算累計學分 _cur CURSOR FOR SELECT ,課名 ,成績 ,學分 FROM 選課表 E, 課程表 C,開課表 O WHERE = AND = AND 成績 =60 AND 學號 =@學號 187。38 ? 打開計算累計學分 _cur,逐門顯示該學生所選的課程及成績并根據(jù)條件計算該學生獲取學分總數(shù) ? OPEN 計算累計學分 _cur ? FETCH NEXT FROM 計算累計學分 _cur INTO @課號 ,@課名 ,@成績 ,@學分 ? SELECT @累計學分 =0 ? IF @@FETCH_STATUS 0 PRINT 39。沒有課程被選修 39。 ? WHILE @@fetch_status=0 ? BEGIN ? SELECT @message=@課號 +39。 39。+ @課名 +39。 39。+CONVERT(CHAR(8), @成績 )+ 39。 39。+ CONVERT(CHAR(8), @學分 ) ? PRINT @message 187。39 ? SELECT @累計學分 =@累計學分 +@學分 ? FETCH NEXT FROM 計算累計學分 _cur INTO @課號 ,@課名 ,@成績 ,@學分 ? END ? 顯示當前學生所獲取的總的學分 ? SELECT @message=39。累計的學分是 : 39。 + CONVERT(CHAR(8), @累計學分 ) ? PRINT @message ? CLOSE 計算累計學分 _cur ? DEALLOCATE 計算累計學分 _cur 187。40 ? 如果計算出的新的學分總數(shù)和原學分數(shù)不一樣的話,進行游標定位修改 ? IF @累計學分 @累計學分 ? BEGIN ? UPDATE 學生表 ? SET 累計學分 =@累計學分 ? WHERE CURRENT OF P_檢查學分登記 _cur ? END ? FETCH NEXT FROM P_檢查學分登記 _cur INTO @學號 , @姓名 ,@累計學分 ? END ? 關(guān)閉游標 ? CLOSE P_檢查學分登記 _cur ? 釋放游標 ? DEALLOCATE P_檢查學分登記 _cur ? END 187。41 ? 要檢查并修改信息學院學生的學分獲取情況,可以如下調(diào)用執(zhí)行存儲過程: ? DECLARE @return_status INT, @所在院系 CHAR(20) ? SET @所在院系 =39。信電學院 39。 ? EXEC @return_status = P_檢查學分登記 @所在院系 ? IF (@return_status =1) PRINT 39。沒有輸入學院名稱 39。 ? IF (@return_status =2) PRINT 39。所輸入學院名稱不存在 39。 ? IF (@return_status =0) PRINT @所在院系 +39。學生學分檢查修改成功 39。 ? GO 187。42 小 結(jié) 存儲過程是一組實現(xiàn)特定功能的 Transact SQL 語句集,經(jīng)編譯后存儲在數(shù)據(jù)庫中,它與其他程序設計語言中的過程類似,也可以接受輸入?yún)?shù),以參數(shù)形式返回輸出值,或者返回成功、失敗的狀態(tài)信息。每次存儲過程運行時,無須重新編譯(除非強制要求)。本章主要討論了存儲過程的創(chuàng)建、修改、執(zhí)行和管理,并列舉了大量的示例,最后對兩個應用實例進行分析。 187。43 Thank you very much! 謝謝您的光臨! 下一章 187。44