一、實驗目的
1、掌握建立遊標的方法和步驟;
2.掌握遊標的使用方法;
二、實驗內容
1、遊標的建立;
2、遊標的使用方法。
三、實驗步驟
1、遊標的建立。
1)使用S_C資料庫中的S表、C表、SC表建立一個預存程序—sp_CURSOR1。該預存程序的作用是:顯示所有的課程資訊,如果成績>=90顯示成績本身;成績>=80顯示良;成績>=70顯示中;成績>=60顯示及格;成績>=0顯示不及格;如果沒有成績則顯示無成績。資訊還包含學號,姓名,課程和成績,顯示格式如下:學號---姓名---課程---成績,1所示。
要求使用遊標技術實現上述要求,使用Print語句實現顯示。
圖1 成績顯示格式
sp_CURSOR1的建立語句:
IF EXISTS(SELECT name FROM sysobjects WHERE name = 'sp_CURSOR1' AND type = 'P')
DROP PROCEDURE sp_CURSOR1
GO
CREATE PROCEDURE sp_CURSOR1
AS
BEGIN
DECLARE @sno char(10)
DECLARE @name char(10)
DECLARE @cno char(10)
DECLARE @grade int
DECLARE S_CURSOR CURSOR
FOR
SELECT S.sno, S.sname, C.cname, SC.grade FROM SC, S, C
WHERE S.sno = SC.sno AND SC.cno = C.cno
OPEN S_CURSOR
FETCH NEXT FROM S_CURSOR INTO @sno, @name, @cno, @grade
WHILE @@FETCH_STATUS = 0
BEGIN
IF @grade IS NULL
PRINT RTRIM(@sno) +'---'+ RTRIM(@name) +'---'+ RTRIM(@cno) +'---無成績'
ELSE IF @grade >= 90
PRINT RTRIM(@sno) +'---'+ RTRIM(@name) +'---'+ RTRIM(@cno) +'---'+CONVERT(VARCHAR(20), @grade)
ELSE IF @grade >= 80
PRINT RTRIM(@sno) +'---'+ RTRIM(@name) +'---'+ RTRIM(@cno) +'---良'
ELSE IF @grade >= 70
PRINT RTRIM(@sno) +'---'+ RTRIM(@name) +'---'+ RTRIM(@cno) +'---中'
ELSE IF @grade >= 60
PRINT RTRIM(@sno) +'---'+ RTRIM(@name) +'---'+ RTRIM(@cno) +'---及格'
ELSE IF @grade >= 0
PRINT RTRIM(@sno) +'---'+ RTRIM(@name) +'---'+ RTRIM(@cno) +'---不及格'
FETCH NEXT FROM S_CURSOR INTO @sno, @name, @cno, @grade
END
CLOSE S_CURSOR
DEALLOCATE S_CURSOR
END
結果描述:
2、遊標的使用。
計算銀行利息。有一儲戶帳號為0001,銀行存取記錄如下:
交易日期 |
交易金額 |
賬戶餘額 |
備忘 |
2010-10-01 |
10000 |
10000 |
開戶存入 |
2010-12-20 |
20000 |
30000 |
|
2011-02-03 |
-5000 |
25000 |
|
2011-05-01 |
-3000 |
22000 |
|
2011-10-10 |
6000 |
28000 |
|
存取記錄資料表名為fundlist,欄位名為id(編號,int),cid(儲戶帳號,varchar(20)),ex-date(交易日期,datetime),ex-money(交易金額,money),balance(賬戶餘額,money)。根據有關規定,銀行存款利息為:2011-04-01號之前(包括)為年利息2%,之後(不包括)為年利息3%,請用編寫一個預存程序sp_cal_interest用來計算該儲戶的當前利息,要求利用遊標實現。說明:當前用getdate()表示,年利息2%用存入的天數*2%/365表示利息。
IF EXISTS(SELECT name FROM sysobjects WHERE name = 'sp_cal_interest' AND type = 'P')
DROP PROCEDURE sp_cal_interest
GO
CREATE PROCEDURE sp_cal_interest
AS
DECLARE @time datetime
DECLARE @money money
DECLARE @pretime datetime
DECLARE @all money
DECLARE @lixi money
DECLARE @T datetime
BEGIN
SET @T = CAST('2011-04-01' AS datetime)
DECLARE f_cursor CURSOR FOR
SELECT ex_date, balance FROM fundlist
OPEN f_cursor
FETCH NEXT FROM f_cursor INTO @time, @money
SET @pretime = @time
SET @all = @money
WHILE @@FETCH_STATUS = 0
BEGIN
IF @time <= @T
SET @lixi = @all*DATEDIFF(DAY, @pretime, @time)*0.02/365
ELSE IF @time > @T AND @pretime <= @T
SET @lixi = @all*DATEDIFF(DAY, @pretime, @T)*0.02/365
+@all*DATEDIFF(DAY, @T, @time)*0.03/365
ELSE
SET @lixi = @all*DATEDIFF(DAY, @pretime, @time)*0.03/365
SET @all = @all+@lixi+@money
SET @pretime = @time
FETCH NEXT FROM f_cursor INTO @time, @money
END
PRINT @lixi
CLOSE f_cursor
DEALLOCATE f_cursor
END
四、實驗總結