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