實驗六:語法元素、流程控制與遊標

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

1、使用局部變量、全局變量

(1)定義一個tinyint的整型變量,爲其賦值58,並顯示變量的值。

DECLARE @var tinyint

SET @var=58

SELECT @var input

(2)定義一個長度爲20的可變長度型字符變量,爲其賦值“Welcome to FJUT”, 並顯示變量的值。

DECLARE @var varchar(20)

SET @var='Welcome to FJUT'

SELECT @var string

(3)在批處理中聲明兩個局部變量@ssex和@sdept並對它們賦值,對Student表進行查詢,要求兩局部變量在SELECT 語句的 WHERE 子句中被使用,查詢的要求是性別爲‘男’或所在係爲‘CS’系的那些學生。

DECLARE @ssex varchar(2),@sdept varchar(4)

SET @ssex='男'

SET @sdept='CS'

SELECT *

FROM Student

WHERE Ssex=@ssex OR Sdept=@sdept;

(4)查詢當前數據庫管理系統版本。

SELECT @@VERSION version;

(5)在student表中執行所有學生年齡加1歲語句,並用 @@ROWCOUNT 來檢測是否有發生更改的行。

UPDATE Student

SET Sage+=1

SELECT @@ROWCOUNT lines;

2函數的使用

(1) 數學函數的使用:

a.分別用函數求出-5的絕對值,25的平方根,3的三次方。

SELECT ABS(-5) 絕對值

SELECT SQRT(25)   平方根

SELECT 3*3*3 三次方

b.寫出以下語句的執行結果:

Select '自然對數'=LOG(10),

        '指數'    =EXP(2),

        '符號'    =SIGN(2)

Select '圓周率'  =PI(),

'正弦'    =SIN(PI()/2.0),

'餘弦'    =COS(PI())

(2) 字符串函數的使用:

去掉字符串'  machine  '左邊的2個空格,右邊與'press'連接起來;

DECLARE @str1 varchar(10)

SET @str1='  machine';

DECLARE @str2 varchar(10)

SET @str2='press';

SELECT LTRIM(@str1)+@str2 string;

(3) 日期、時間函數的使用:

1)返回系統當前日期並以整數形式返回當前日期的年份、月份、日;

SELECT DATENAME(YYYY,GETDATE())+'年'+DATENAME(MM,GETDATE())+'月'+DATENAME(DD,GETDATE())+'日' 日期;

2)返回給定日期“2018-5-21”與當前日期相差的天數。

SELECT DATEDIFF(DAY,'2018-5-21',GETDATE()) 相差的天數;

 (4) 系統函數與元數據函數的使用:顯示當前數據庫用戶的名稱

SELECT USER 當前數據庫用戶;

  1. 編寫Select語句或Transact-SQL程序

(1)在 SELECT 語句中,CASE 搜索函數允許根據比較值在結果集內對值進行替換。要求仿照《數據庫系統概論》的sc表,根據學生的成績範圍將成績(grade 列)顯示爲文本註釋。(要求:<60分,文本註釋爲“不及格”,60-70,“及格”,70-80,“中”,80-90,“良”,90-100,“優”)。

執行結果形式如下:

sno        cno   Grade Classified grade

--------- ---- ---------------- ------

200215121 4    成績爲空!            NULL

. . . . . .

200215126 6    不及格               55

200215122 2    良                   80

200215122 1    優                   92

(11 行受影響)

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 '成績等級'

FROM SC;

(2)用Transact-SQL語言編寫程序計算1~100之間所有能被7整除的數的總和。

DECLARE @i int

DECLARE @s int

SET @i=1

SET @s=0

WHILE @i<=100

BEGIN

    IF(@i%7=0)

         SET @s+=@i

    SET @i+=1

END

    PRINT '總和:'+CAST(@s AS char(10))

(3)*自選實例,實踐並掌握Transact-SQL以下控制流語言的使用方法:
BEGIN...ENDWHILEBREAKCONTINUEIF...ELSEWAITFOR

例子1:求十以內的奇數積

DECLARE @i int,@s int

SET @i=1

SET @s=1

WHILE(@i<=10)

BEGIN

    SET @s*=@i

    SET @i+=2;

END

    PRINT '10以內的奇數積:'+CAST(@s AS char(10))

例子2

-- 由於BEGIN...END, WHILE, BREAK, CONTINUE, IF...ELSE在前面的題目中都已經做過了,這裏就演示waitFor

--方法1

BEGIN

    --該語句將會在18:00的時候執行

    WAITFOR TIME '18:00';

    UPDATE SC SET Grade+=10;

END;

--方法2

BEGIN

    -- 該語句會在2小時後執行

    WAITFOR DELAY '02:00'

    UPDATE SC SET Grade+=10

END

 

(4)*自選實例,實踐並掌握以下Transact-SQL語句:
/*...*/(註釋)--(註釋)PRINT

/*這是一段註釋*/

-- 這也是一段註釋

-- 以上兩句註釋可以執行,但是沒有任何作用,也不會有任何影響

--下面是1-100的求和

DECLARE @s int, @i int

SET @s=0

SET @i=1

WHILE @i <= 100

BEGIN

    SET @s=@s+@i

    SET @i=@i+1;

END

    PRINT '1-100的總和:'+CAST(@s AS char(10))

4. 創建存儲過程printgrade,輸入課程號,能按如下格式顯示該課程的學生成績單,並輸出選修該課程的學生人數,如果輸入的課程號不存在,用RAISERROR('輸入錯誤,沒有該課程號!', 16, 1)函數進行出錯處理。(要求在存儲過程中使用遊標技術)

課程號:1    課程名:數據庫            

____________________________________

200215121   李勇                 92 

200215122   劉晨                 92 

200215125   張立                 null

CREATE PROCEDURE printgrade(@cno int)

AS

BEGIN

    DECLARE @sno varchar(10),@grade int,@cname varchar(20),@sname varchar(20)

    DECLARE stu CURSOR FOR SELECT Student.Sno,Student.Sname,SC.Grade FROM Student,SC WHERE Student.Sno=SC.Sno AND SC.Cno=@cno

    UPDATE SC SET Cno=@cno WHERE Cno=@cno

    IF(@@ROWCOUNT=0)

             RAISERROR('輸入錯誤,沒有該課程號!', 16, 1)

    ELSE

         BEGIN

             SELECT @cname=Cname FROM Course,SC WHERE SC.Cno=Course.Cno AND Course.Cno=@cno

             PRINT '課程號:'+CAST(@cno AS char(3))+'     '+'課程名:'+@cname

             PRINT '---------------------------------------'

             OPEN stu

             FETCH NEXT FROM stu INTO @sno,@sname,@grade

             WHILE @@FETCH_STATUS=0

                  BEGIN

                  PRINT @sno+' '+@sname+'   '+CAST(@grade AS char(3))

                  FETCH NEXT FROM stu INTO @sno,@sname,@grade

                  END

             CLOSE stu

             DEALLOCATE stu

             END

END

EXECUTE printgrade 2;

5. 調用該存儲過程並輸出“1”號課程的成績單和選修該課程的學生人數。執行結果的形式如下:

課程號:1    課程名:數據庫            

____________________________________

200215121   李勇                 92 

200215122   劉晨                 92 

200215125   張立                 null

 

1號課的選修人數爲:3

或者

消息50000,級別16,狀態1,過程printgrade,第11 行

輸入錯誤,沒有該課程號!

輸入的課程號不存在!

CREATE PROCEDURE printgrade2(@cno int)

AS

BEGIN

    DECLARE @sno varchar(10),@grade int,@cname varchar(20),@sname varchar(20),@num int

    DECLARE stu CURSOR FOR SELECT Student.Sno,Student.Sname,Sc.Grade FROM Student,SC

    WHERE Student.Sno=SC.Sno AND SC.Cno=@cno

    UPDATE SC SET Cno=@cno WHERE Cno=@cno

    SET @num=@@ROWCOUNT

         IF(@num=0)

                  RAISERROR('輸入的課程號不存在!', 16, 1)

         ELSE

             BEGIN

                  SELECT @cname=Cname FROM Course,SC WHERE SC.Cno=Course.Cno AND Course.Cno=@cno

                  PRINT '課程號:'+CAST(@cno AS char(3))+'     '+'課程名:'+@cname

                  PRINT '---------------------------------------'

                  OPEN stu

                  FETCH NEXT FROM stu INTO @sno,@sname,@grade

                      WHILE @@FETCH_STATUS=0

                          BEGIN

                               PRINT @sno+' '+@sname+'        '+CAST(@grade AS CHAR(3))

                               FETCH NEXT FROM stu INTO @sno,@sname,@grade

                          END

                  CLOSE stu

                  DEALLOCATE stu

             END

             PRINT CAST(@cno AS CHAR(2))+'號課的選修人數:'+CAST(@num AS CHAR(10))

END

EXECUTE printgrade2 3;

6. 附加題:

用 @@ERROR 檢測INSERT 和 DELETE 語句的成功操作與否。

INSERT Student VALUES('32134165','xxxx',21,'CS')

SELECT @@ERROR 錯誤信息

INSERT Student VALUES('32134165','xxxx','男',21,'CS')

SELECT @@ERROR 錯誤信息

DELETE FROM Student WHERE Sname='xxxx'

SELECT @@ERROR 錯誤信息

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