SQL数据库学习之路(练习)---游标操做、动态SQL语句

实验的数据链接我以前的博客SQL练习建立数据库内容

游标操做:

1、实现一个游标,顺序读取并打印全部学生的  学号、课程号、成绩 信息,读取过程当中删除S5的选课记录,并将为空的成绩修改成60分。

提示:编写过程当中,可需参阅联机丛书获取下列内容的具体用法sql

一、声明变量可用declare,为变量赋值用set数据库

二、须要判断可用if语句,如if内需执行多条语句,可用begin 和 end 来限定if做用的范围c#

三、可经过while循环来依次读取全部记录,读取状态可用@@FETCH_STATUS获取函数

四、如游标已建立,但执行过程当中出错。致使从新执行时提示游标已存在,可用cursor_status来检查是否存在该游标,如存在,则先deallocatefetch

declare @S# VARCHAR(16);     --定义临时变量
declare @C# VARchar(8);
declare @SCORE VARCHAR(4);
declare mycursor cursor for   --定义游标
select SC.S#,SC.C#,SC.SCORE FROM dbo.SC
open mycursor;    --打开游标
fetch from mycursor into @S#,@C#,@SCORE;
WHILE @@FETCH_STATUS =0  --若是上一次操做成功则继续循环 
BEGIN 
print 'S#: '+@S#+'C#:'+@C#+'SCORE:'+@SCORE
fetch from mycursor into @S#,@C#,@SCORE; 
END 
空行是由于成绩的数据位空(NULL)

在操做游标时,须要经过declare先定义几个须要的临时变量,spa

declare mycursor cursor for  select SC.S#,SC.C#,SC.SCORE FROM dbo.SC 这句话是定义游标语句。3d

mycursor是游标的名字,dbo.SC是游标使用的数据库表名,SC.S#,SC.C#,SC.SCORE是SC表的属性。code

建立好游标以后须要打开游标 openblog

上面的实验代码为使用游标语句检索SC表中的S#,C#,SCORE三个属性的数据。结果以下图:get

 读取过程当中删除S5的选课记录,并将为空的成绩修改成60分。

代码以下:

open mycursor;    --打开游标
fetch from mycursor into @S#,@C#,@SCORE;
WHILE @@FETCH_STATUS =0  --若是上一次操做成功则继续循环 
BEGIN
if(@SCORE is null)
update SC set SCORE='60' where current of mycursor
if(@S#='s5')
delete from SC where current of mycursor  
print 'S#: '+@S#+'C#:'+@C#+'SCORE:'+@SCORE
fetch from mycursor into @S#,@C#,@SCORE; 
END

结果以下:

 

2、实现一个卷游标,逆序打印全部学生的  学号、课程号、成绩信息

declare mycursor scroll cursor for   --定义游标
select SC.S#,SC.C#,SC.SCORE FROM dbo.SC order by S# DESC;

 动态SQL语句

1、实现一个存储过程getTopResultByTbname,要求输入表名和要检索的结果数量n,检索该表的前n条记录。

use Work
go
create procedure getTopResultByTbname   --建立函数getTopResultByTbname
@number int,@tablename varchar(4)  --定义函数中number,tablename属性
as begin
declare @sql varchar(50) 
set @sql='select top '+ cast(@number as char) + '*from' + @tablename;
exec(@sql);
end

DROP PROCEDURE getTopResultByTbname   --释放函数getTopResultByTbname
exec getTopResultByTbname 3,' SC'   --查询SC表前三行

2、实现一个函数getRankBySnoAndCno,要求输入学生的学号和课程号,返回该生该门课的排名,要求,若是输入的学号或课程号在SC表中不存在,则返回为-1。

go
create function getRankBySnoAndCno  --定义方法getRankBySnoAndCno
(@s# char(16),@c# char(16)) returns int --定义方法中属性S#,C#
as begin
declare @ret int ,@score float
if not exists (select *from sc where S#=@s# and C#=@c# )
set @ret=-1
else begin
set @score =(select SCORE from sc where S#=@s# and C#=@c# ) --SQL语句
set @ret=(select count(*) from SC where C#=@c# and SCORE>@score)+1 --SQL语句
end 
return @ret
end
select dbo.getRankBySnoAndCno('s1','c1') --对SC表中的s1,c1进行检索

相关文章
相关标签/搜索