游标应用

新建数据库数据库名为db+’你的学号


2、 1)创建考生表,字段包括:准考证号,姓名,性别,报考专业、总分(初始值为空),准考证号为主键。
2)考生成绩表,字段包括准考证号、科目名称(设定英语、政治、数学、专业综合),成绩,准考证号为外部键,创建专业综合成绩约束0-150分,其他科目1-100分,在准考证号上建立非聚集索引。
以上表的字段类型自行拟定,初始记录自行判断插入,考生表不少于1条记录,成绩表根据考生自行拟定相应记录。
(提示:表名与字段名均采用中文)
3、 编写存储过程统计更新考生表所有考生的总分。
4、 创建触发器,实现对考生成绩表的审计,并实现总分的自动更新,建立日志表,包括:准考证号,科目名称,原成绩,新成绩。(操作,操作时间操作人,字段类型自拟。)
1) 一条SQL命令更新某考生的所有科目成绩,均加5分。
2) 删除某个考生的所有考试科目记录。
3) 插入某考生考试科目成绩。
检验日志表验证触发器代码编写的正确性。

create database db0182945

create table 考生表(
准考证号 varchar(50) not null primary key,
姓名 varchar(50) not null,
性别 char(2) not null,
报考专业 varchar(50) not null,
总分 int default 0
)

create table 考生成绩表(
准考证号 varchar(50) not null foreign key references 考生表(准考证号),
科目名称 varchar(50) not null,
成绩 int check( 成绩 between 0 and 100)
)

CREATE NONCLUSTERED INDEX index_id
ON 考生表(准考证号) 


insert 考生表 values('001','李红','女','经济系',605)
insert 考生表 values('002','王辉','男','法学系',585)

insert 考生成绩表 values('001','英语',88)
insert 考生成绩表 values('002','英语',89)
insert 考生成绩表 values('001','政治',90)
insert 考生成绩表 values('002','政治',91)
insert 考生成绩表 values('001','数学',92)
insert 考生成绩表 values('002','数学',93)
insert 考生成绩表 values('001','专业综合',94)
insert 考生成绩表 values('002','专业综合',95)

/*3题*/
use db0182945
GO
create proc p1 
as
begin
update 考生表 set 总分=0
Declare gradeChange_cursor cursor scroll for select 准考证号,成绩 from 考生成绩表
open gradeChange_cursor
Declare @id varchar(50)
Declare @grade int
fetch next from gradeChange_cursor into @id,@grade
while(@@FETCH_STATUS=0)
begin      
  update 考生表 set 总分= 总分+@grade where 准考证号 =@id
  fetch next from gradeChange_cursor into @id,@grade
end
close gradeChange_cursor
deallocate gradeChange_cursor
select*from 考生表
end

EXEC p1

/*4题*/
create table 日志表(
准考证号 varchar(50) not null,
科目名称 varchar(50) not null,
原成绩 int,
新成绩 int
)

/*更新触发器*/
use db0182945
GO
create trigger tr1
on 考生成绩表
for update,insert,delete
as
begin
Declare @id varchar(40)
Declare @course varchar(50)
Declare @oldgrade int
Declare @newgrade int
if(exists(select * from inserted) and exists(select * from deleted))
begin
Declare grade_cursor cursor scroll for select * from deleted
Declare grade_cursor1 cursor scroll for select 成绩 from inserted
open grade_cursor
open grade_cursor1
fetch next from grade_cursor into @id,@course,@oldgrade
fetch next from grade_cursor1 into @newgrade
while(@@FETCH_STATUS=0)
begin
	update 考生表 set 总分=总分-@oldgrade+@newgrade where 准考证号=@id
	insert into 日志表 values(@id,@course,@oldgrade,@newgrade) 
	fetch next from grade_cursor into @id,@course,@oldgrade
	fetch next from grade_cursor1 into @newgrade
end
close grade_cursor
deallocate grade_cursor
close grade_cursor1
deallocate grade_cursor1
end
end

update 考生成绩表 set 成绩=成绩-5
select*from 日志表

/*删除触发器*/
use db0182945
GO
create trigger tr2
on 考生成绩表
for update,insert,delete
as
begin
Declare @id varchar(40)
Declare @course varchar(50)
Declare @oldgrade int
Declare @newgrade int
if(not exists(select * from inserted) and exists(select * from deleted))
begin
Declare grade_cursor cursor scroll for select * from deleted
open grade_cursor
fetch next from grade_cursor into @id,@course,@oldgrade
while(@@FETCH_STATUS=0)
begin
	update 考生表 set 总分=总分-@oldgrade where 准考证号=@id
	insert into 日志表 values(@id,@course,@oldgrade,0) 
	fetch next from grade_cursor into @id,@course,@oldgrade
end
close grade_cursor
deallocate grade_cursor
end
end

delete from 考生成绩表 where 准考证号='001'
select*from 日志表

/*插入触发器*/
use db0182945
GO
create trigger tr3
on 考生成绩表
for update,insert,delete
as
begin
Declare @id varchar(40)
Declare @course varchar(50)
Declare @oldgrade int
Declare @newgrade int
if(exists(select * from inserted) and not exists(select * from deleted))
begin
Declare grade_cursor cursor scroll for select * from inserted
open grade_cursor
fetch next from grade_cursor into @id,@course,@newgrade
while(@@FETCH_STATUS=0)
begin
	update 考生表 set 总分=总分+@newgrade where 准考证号=@id
	insert into 日志表 values(@id,@course,0,@newgrade) 
	fetch next from grade_cursor into @id,@course,@newgrade
end
close grade_cursor
deallocate grade_cursor
end
end

insert 考生成绩表 values('001','英语',88)
insert 考生成绩表 values('001','政治',90)
insert 考生成绩表 values('001','数学',92)
insert 考生成绩表 values('001','专业综合',94)
select*from 日志表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值