心理散文想法

Sql Server数据库编程存储过程实现和调用

2021-12-11  本文已影响0人  Cache_wood

@[toc]


存储过程的实现和调用

设置关系表

之前的作业中已经设计过关系表,这里继续沿用之前设计的关系表

期末计算GPA并分段统计,选出年度三好学生
if (exists (select * from sys.objects where name = 'prt_stu_gpa'))
    DROP PROCEDURE prt_stu_gpa
go
Create procedure prt_stu_gpa as
begin 
    declare @v_no char(6),@v_gpa float
    declare s_cur cursor for select Sno,round(sum(Ccredit*Grade/25.0)/sum(Ccredit),2) as gpa
    from Course19377056,Sc19377056 where Course19377056.Cno = Sc19377056.Cno and Grade>=60
    group by Sno

    open s_cur
    fetch s_cur into @v_no,@v_gpa
    while (@@FETCH_STATUS=0)
    begin
        if (@v_gpa>=3.6) 
            begin
                print @v_no + convert(char(8),@v_gpa) + '成绩优秀'  
                print @v_no + '是优秀学生'
            end
        else if (@v_gpa>=3.2) print @v_no + convert(char(8),@v_gpa) + '成绩合格'
        else                print @v_no  + convert(char(8),@v_gpa) + '成绩不合格'
        fetch s_cur into @v_no,@v_gpa
    end
    close s_cur
    deallocate s_cur
end

Exec prt_stu_gpa
go
S001  3.6     成绩优秀
S001  是优秀学生
S002  2.98    成绩不合格
S003  3.17    成绩不合格
S101  3.15    成绩不合格
S201  2.64    成绩不合格
S202  3.44    成绩合格
S203  3.34    成绩合格
S301  3.44    成绩合格
S302  3.84    成绩优秀
S302  是优秀学生
S401  3.54    成绩合格
S402  3.59    成绩合格
S403  3.37    成绩合格
S501  3.59    成绩合格
S502  3.64    成绩优秀
S502  是优秀学生
S503  3.31    成绩合格

触发器实现

禁止在非工作时间更新学生成绩
Create trigger Tsecure_sc on Sc19377056 for Insert, Delete, Update 
as
begin
If ( DateName(weekday, getdate() ) = '星期六' OR
 DateName(weekday, getdate() ) = '星期日' OR
 Convert (Int, DateName(hour, getdate() ) )
 Not Between 9 and 17 )
Begin
RAISERROR ('只许在工作时间操作', 16, 1)
ROLLBACK TRANSACTION
End
End

update Sc19377056 set Grade =70 
where Sno='S002' and Cno = '8002'
Msg 50000, Level 16, State 1, Procedure Tsecure_sc, Line 10 [Batch Start Line 72]
只许在工作时间操作
Msg 3609, Level 16, State 1, Line 73
事务在触发器中结束。批处理已中止。

Completion time: 2021-11-21T10:24:35.4024546+08:00
建立成绩更新记录表
CREATE TABLE Stu_update(   #创建更新之后的保存表
    Sno char(8) not null, 
    Cno char(8) not null, 
    Old_grade tinyint null,
    New_grade tinyint null,
    Time_ud Datetime,
    Sys_user char(6))
Create trigger Td_student2 on Sc19377056 for update  #创建触发器,要求如题目所示
as
Begin
if @@rowcount = 0
return
insert into Stu_update(Sno,Cno,Old_grade,New_grade,Time_ud,Sys_user)
select deleted.Sno, deleted.Cno,deleted.Grade,inserted.Grade,
GETDATE(), SYSTEM_USER
from deleted,inserted
End

select * from Stu_update  #观察更新数据前后新表的变化

update Sc19377056 set Grade =90
where Sno='S002' and Cno = '8002'
update Sc19377056 set Grade =90
where Sno='S003' and Cno = '9001'

select * from Stu_update

更新前

Sno Cno Old_grade New_grade Time_ud Sys_user

更新后

Sno Cno Old_grade New_grade Time_ud Sys_user
S002 8002 93 90 2021-11-21 11:29:12.157 sa
S003 9001 86 90 2021-11-21 11:34:46.150 sa

高级语言的数据库连接与数据表访问

# !usr/python/bin
# -*- coding:utf-8 -*-
import pyodbc #使用pyodbc操作数据库
 
sqlconn = pyodbc.connect(DRIVER='{SQL Server}',  #输入参数进行连接
                         SERVER='127.0.0.1,1433',
                         DATABASE='STUDENT19377056',
                         UID='sa',
                         PWD='root')
 
cursor = sqlconn.cursor()  #创建游标

sql = 'select Sno,round(sum(Ccredit*Grade/25.0)/sum(Ccredit),2) as gpa from Course19377056,Sc19377056\
        where Course19377056.Cno = Sc19377056.Cno and Grade>=60 group by Sno'
cursor.execute(sql)  #执行sql语句
rows = cursor.fetchall()
for row in rows: #获得学生的GPA
    print(row.Sno,row.gpa)
S001     3.6
S002     2.98
S003     3.17
S101     3.15
S201     2.64
S202     3.44
S203     3.34
S301     3.44
S302     3.84
S401     3.54
S402     3.59
S403     3.37
S501     3.59
S502     3.64
S503     3.31
上一篇 下一篇

猜你喜欢

热点阅读