SQL server 14编程基础(3)_游标事务

IF EXISTS (SELECT name FROM SYS.DATABASES WHERE name='学生选课')
    DROP DATABASE 学生选课
GO
CREATE DATABASE 学生选课
GO
USE 学生选课
-- DROP TABLE SC,course,student
-- DROP TABLE course
GO

--创建教师表
CREATE TABLE Teacher(
Tno CHAR(3) NOT NULL PRIMARY KEY,
Tname VARCHAR(10) NOT NULL,
Tsex CHAR(2),
Sbirthday DATE,
Prof VARCHAR(6),
Tdept VARCHAR(10)
)
GO

--创建学生表
CREATE TABLE Student(
Sno CHAR(5) NOT NULL PRIMARY KEY,
Sname VARCHAR(10) NOT NULL,
Ssex CHAR(2),
Sage TINYINT,
Sdept VARCHAR(10)
)
GO

--创建课程表
CREATE TABLE Course(
Cno CHAR(3) NOT NULL PRIMARY KEY,
Cname VARCHAR(20) NOT NULL,
Cpno CHAR(3),
Credit TINYINT,
Semester TINYINT,
Tno CHAR(3)
)
GO

--创建选课表
CREATE TABLE SC(
Sno CHAR(5) NOT NULL,
Cno CHAR(3) NOT NULL,
Grade INT
)
GO

-- 插入教师表数据
-- SP_HELP Teacher
INSERT INTO Teacher 
VALUES ('104','李诚','男','1958/12/2','副教授','计算机系')
,('256','张旭','男','1969/3/12','讲师','数学系')
,('125','王萍','女','1972/5/5','助教','计算机系')
,('331','刘冰','女','1977/8/14','助教','信息系')
GO    
-- SELECT * FROM Teacher

-- 插入学生表数据
-- SP_HELP Student
INSERT INTO Student 
VALUES('95001','刘超华','男',22,'计算机系')
,('95002','刘晨','女',21,'信息系')
,('95003','王敏','女',20,'数学系')
,('95004','张海','男',23,'数学系')
,('95005','陈平','男',21,'数学系')
,('95006','陈斌斌','男',28,'数学系')
,('95007','刘德虎','男',24,'数学系')
,('95008','刘宝祥','男',22,'计算机系')
,('95009','吕翠花','女',26,'计算机系')
,('95010','马盛','男',23,'数学系')
,('95011','吴霞','男',22,'计算机系')
,('95012','马伟','男',22,'数学系')
,('95013','陈冬','男',18,'信息系')
,('95014','李小鹏','男',22,'计算机系')
,('95015','王娜','女',23,'信息系')
,('95016','胡萌','女',23,'计算机系')
,('95017','徐晓兰','女',21,'计算机系')
,('95018','牛川','男',22,'信息系')
,('95019','孙晓慧','女',23,'信息系')
GO
-- SELECT * FROM Student

-- 插入课程表数据
-- SP_HELP Course
INSERT INTO Course 
VALUES('101','数据库','105',5,4,'125')
,('104','操作系统','106',1,2,'104')
,('105','数据结构','107',1,3,'104')
,('106','数据处理',NULL,1,2,'331')
,('107','C语言','106',3,1,'125')
,('108','Java',NULL,3,3,'256')
,('109','网页制作',NULL,2,5,'125')
,('110','c++',NULL,3,4,'104')
,('111','网络编程',NULL,2,5,'104')
,('201','高等数学',NULL,1,1,'256')
,('301','信息系统','101',1,3,'331')
GO
-- SELECT * FROM Course WHERE Cpno IS NULL-- 插入选课表数据
--SP_HELP SC
INSERT INTO SC 
VALUES('95001','101',87)
,('95001','201',76)
,('95001','301',79)
,('95001','104',80)
,('95001','105',81)
,('95001','106',82)
,('95001','107',67)
,('95002','101',89)
,('95002','201',81)
,('95004','101',83)
,('95004','201',56)
,('95005','101',89)
,('95006','101',54)
,('95006','201',77)
,('95010','101',56)
,('95013','301',80)
,('95013','105',90)
,('95014','201',NULL)
,('95015','201',NULL)
GO
--SELECT * FROM SC


--  声明游标 stu_is_cur,返回信息系学生的学号、姓名、年龄信息,且该游标允许前后滚动和
--修改其中数据。检索第3行、前一行、最开始一行和最后一行数据并显示,
--不需要使用变量接收数据。关闭并释放游标。
 

declare stu_is_cur cursor scroll
for select Sno,Sname,Sage from Student where Sdept='信息系'
for update
open stu_is_cur

fetch absolute 3 from stu_is_cur 
fetch prior from stu_is_cur 
fetch first from stu_is_cur 
fetch last from stu_is_cur 

close stu_is_cur 
deallocate stu_is_cur 

-- 声明游标 stu_sc_cur,打印出每个学生学号、姓名和选课门数,
--显示结果形如“学生编号:95001,姓名:刘超华,选课门数:5”
 

declare stu_sc_cur cursor
for select S.Sno,Sname,count(*) from Student S join SC 
on S.Sno=SC.Sno group by S.Sno,Sname 
declare @sno CHAR(5),@sname VARCHAR(10),@count int
open stu_sc_cur

fetch next from stu_sc_cur into @sno,@sname,@count
while @@FETCH_STATUS=0
    begin
        print '学生编号:'+@sno+', 姓名:'+@sname+', 选课门数:'+cast(@count as varchar)
        fetch next from stu_sc_cur into @sno,@sname,@count
    end
close stu_sc_cur
deallocate stu_sc_cur

 

-- 声明游标 sc_cur,打印不及格成绩的学号、课程编号、成绩信息,
-- 形如“学号:95004,课程编号:201,成绩:56”,并将其中“101”课程的成绩提高4分。

declare sc_cur cursor
for select Sno,Cno,Grade from SC where Grade < 60
declare @sno char(5),@cno char(3),@grade int
open sc_cur

fetch next from sc_cur into @sno,@cno,@grade
while @@FETCH_STATUS=0
    begin
        print '学号:'+@sno+', 课程编号:'+@cno+', 成绩:'+cast(@grade as varchar)
        if @cno='101'
            update SC set Grade=Grade+4 where current of sc_cur
        fetch next from sc_cur into @sno,@cno,@grade
    end
close sc_cur
deallocate sc_cur

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在设计 SQL Server 网上购物系统时,游标和函数是非常有用的工具。游标可用于处理一系列数据行,而函数可用于执行特定的操作并返回结果。 以下是创建游标和函数的步骤: 创建游标: 1. 使用 DECLARE 语句声明游标变量,并指定要查询的数据集。 2. 使用 OPEN 语句打开游标并将游标指向数据集的第一行。 3. 使用 FETCH 语句检索当前游标指向的行,并将该行的数据存储到变量中。 4. 使用 WHILE 循环遍历游标,直到到达数据集的末尾。 5. 在处理完数据后,使用 CLOSE 和 DEALLOCATE 语句关闭游标。 以下是一个示例创建游标SQL 代码: ``` DECLARE @ProductName varchar(100) DECLARE @ProductPrice money DECLARE ProductCursor CURSOR FOR SELECT ProductName, ProductPrice FROM Products OPEN ProductCursor FETCH NEXT FROM ProductCursor INTO @ProductName, @ProductPrice WHILE @@FETCH_STATUS = 0 BEGIN PRINT 'Product name: ' + @ProductName PRINT 'Product price: ' + CAST(@ProductPrice AS varchar(20)) FETCH NEXT FROM ProductCursor INTO @ProductName, @ProductPrice END CLOSE ProductCursor DEALLOCATE ProductCursor ``` 创建函数: 1. 使用 CREATE FUNCTION 语句创建函数。 2. 在函数中编 SQL 代码,执行特定的操作。 3. 使用 RETURN 语句返回结果。 以下是一个示例创建函数的 SQL 代码: ``` CREATE FUNCTION GetProductCountByCategory ( @CategoryName varchar(50) ) RETURNS int AS BEGIN DECLARE @ProductCount int SELECT @ProductCount = COUNT(*) FROM Products WHERE CategoryName = @CategoryName RETURN @ProductCount END ``` 在以上示例中,函数名为 GetProductCountByCategory,它接收一个参数 CategoryName,并返回该类别下的产品数量。在函数中,使用 COUNT 函数计算产品数量,并将结果存储在变量 @ProductCount 中,最后使用 RETURN 语句返回结果。 总的来说,游标和函数都是非常有用的 SQL Server 工具,可以帮助您更好地处理数据和执行特定的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值