实验六、存储过程

一、实验目的

(1)掌握T-SQL流控制语句。
(2)掌握创建存储过程的方法。
(3)掌握存储过程的执行方法。
(4)掌握存储过程的管理和维护。

二、实验内容

  1. 创建简单存储过程
    创建一个名为stu_pr的存储过程,该存储过程能查询出051班学生的所有资料,包括学生的基本信息、学生的选课信息(含未选课同学的信息)。要求在创建存储过程前判断该存储过程是否已创建,若已创建则先删除,并给出“已删除!”信息,否则就给出“不存在,可创建!”的信息。

    if exists(select * from sysobjects where type = 'P' and name='stu_pr')
    begin
    	drop procedure stu_pr
    	print '已删除'
    end
    else
    	print '不存在,可创建!'
    go
    
    create procedure stu_pr
    as
    begin
    	select * from Student
    	left join SC on(SC.Sno=Student.Sno)
    	left join Course on(SC.Cno=Course.Cno)
    	where Classno='051'
    end
    go
    
  2. 创建带参数的存储过程
    (1)创建一个名为stu_proc1的存储过程,查询某系、某姓名的学生的学号、姓名、年龄、选修课程名、成绩。系名和姓名在调用该存储过程时输入,其默认值分别为“%” 与“林%”。执行该存储过程,用多种参数加以测试。

    if exists (select * from sysobjects where name='stu_proc1' and type='P')
    	drop procedure stu_proc1
    go
    create procedure stu_proc1
    	@sdept char(20)='%',@sname varchar(8)='林%'
    as
    	select Student.Sno 学号,Sname 姓名,year(getdate())-year(Birth) 年龄,Cname 课程名,Grade 成绩
    	from Student,Course,SC
    	where Student.Sno=SC.Sno and Course.Cno=SC.Cno
    		and Sdept like @sdept
    		and Sname like @sname
    go
    

    (2)创建一个名为student_sc的存储过程,可查询出某学号段的同学的学号、姓名、总成绩。(学号起始号与终止号在调用时输入,可设默认值。)执行该存储过程。

    if exists(select name from sysobjects where name='student_sc' and type='P')
    	drop procedure student_sc
    go
    create procedure student_sc
    	@startno char(8)='20110001',@endno char(8)='20110002'
    as 
    	select Student.Sno 学号, Sname 姓名,sum(Grade) 总成绩
    	from Student,SC
    	where Student.Sno=SC.Sno
    		and Student.Sno between @startno and @endno
    	group by Student.Sno,Sname
    go
    --执行存储过程
    execute student_sc;
    

    在这里插入图片描述

  3. 创建带输出参数的存储过程
    (1)创建一个名为course_average的存储过程,可查询某门课程考试的平均成绩。总成绩可以输出,以便进一步调用。

    if exists(select name from sysobjects where name='course_average' and type='P')
    	drop procedure course_average
    go
    create procedure course_average
    	@cno varchar(20),@average int output,@sum int output
    as
    	select @average=avg(Grade),@sum=sum(Grade)
    	from SC
    	where Cno=@cno
    	group by Cno
    go
    --执行存储过程
    declare @averageGrade int,@sumGrade int
    execute course_average '001',@averageGrade output,@sumGrade output
    print '该门课程的平均成绩是: '+cast(@averageGrade as varchar(10))
    print '该门课程的总成绩是: ' +cast(@sumGrade as varchar(10))
    

    在这里插入图片描述

    (2)创建一执行该存储过程的批处理,要求当平均成绩小于60时,显示信息为:“XX课程的平均成绩为:XX,其平均分未达60分”。超过60时,显示信息为:“XX课程的平均成绩为:XX”。

    declare @avg int,@sum int
    execute course_average '002',@avg output,@sum output
    if @avg<=60
    	print '002号课程的平均成绩为: '+cast(@avg as varchar(10))+',其平均分未达60分'
    else
    	print '002号课程的平均成绩为:'+cast(@avg as varchar(10))
    

    在这里插入图片描述

  4. 创建带重编译及加密选项的存储过程
    创建一个名为update_sc、并带重编译及加密选项的存储过程,可更新指定学号、指定课程号的学生的课程成绩。(学号、课程号在调用时输入)

    if exists(select name from sysobjects where name='update_sc' and type='P')
    	drop procedure update_sc
    go
    create procedure update_sc
    	@sno varchar(8),@cno varchar(3),@grade tinyint
    	with recompile, encryption
    as 
    	update SC
    	set Grade=@grade
    	where Cno = @cno and Sno = @sno
    
    -- 执行存储过程
    execute update_sc '20110001','001',91;
    

    在这里插入图片描述

  5. 使用T-SQL语句管理和维护存储过程
    (1)使用sp_helptext查看存储过程student_sc的定义脚本。

    sp_helptext 'student_sc'
    

    在这里插入图片描述

    (2)使用select语句查看student_sc存储过程的定义脚本。

    select name,text from sysobjects,syscomments 
    where sysobjects.id=syscomments.id
    	and name='student_sc' and type='P';
    

    在这里插入图片描述

    (3)将存储过程stu_pr改为查询学号为2011001的学生的详细资料。

    alter procedure stu_pr
    as
    	select * from Student
    	left outer join SC on(SC.Sno=Student.Sno)
    	left outer join Course on (SC.Cno=Course.Cno)
    	where Student.Sno='20110001'
    

    在这里插入图片描述

    (4)删除存储过程stu_pr。

    drop procedure stu_pr;
    
  6. 使用SQL Server Management Studio管理存储过程
    (1)在SQL Server Management Studio中重新创建刚删除的存储过程stu_pr。

    create procedure stu_pr
    as
    begin
    	select * from Student
    	left join SC on(SC.Sno=Student.Sno)
    	left join Course on(SC.Cno=Course.Cno)
    	where Classno='051'
    end
    go
    

    (2)查看存储过程stu_pr,并将该过程修改为查询051班女生的所有资料。

    alter procedure stu_pr
    as
    	select * from Student
    	left outer join SC on(SC.Sno=Student.Sno)
    	left outer join Course on (SC.Cno=Course.Cno)
    	where Classno='051' and Sex='女'
    

    在这里插入图片描述

    (3)删除存储过程stu_pr。

    drop procedure stu_pr;
    
  • 23
    点赞
  • 131
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
存储过程和触发器是关系型数据库中的重要组成部分,它们可以帮助我们提高数据库的性能和数据的安全性。下面分别介绍一下存储过程和触发器的概念和用途。 1. 存储过程 存储过程是一段预先编译好的 SQL 语句集合,它可以被多次使用,并且可以带参数。存储过程可以用于执行一些比较复杂的操作,例如查询多个表,更新多个表,或者执行多个操作的组合。 存储过程的好处在于: - 提高数据库性能:存储过程数据库中预编译,可以减少数据库的负担,提高数据库的性能。 - 提高数据安全性:存储过程可以限制对数据库的访问权限,并且可以对数据进行验证和检查。 - 重用性:存储过程可以被多次使用,提高代码的重用性和可维护性。 2. 触发器 触发器是一种特殊的存储过程,它是在数据库发生特定事件时自动执行的。这些事件可以是 INSERT、UPDATE 或 DELETE 操作。触发器可以用于实现数据完整性、安全性和业务逻辑约束等方面。 触发器的好处在于: - 实现数据完整性:触发器可以在数据被写入数据库之前进行验证和检查,确保数据的完整性。 - 提高数据安全性:触发器可以限制对数据库的访问权限,并且可以对数据进行验证和检查。 - 自动化:触发器可以自动执行,减少手动干预的需要。 总之,存储过程和触发器是关系型数据库中的重要组成部分,它们可以帮助我们提高数据库的性能和数据的安全性。在实际应用中,我们可以根据具体情况选择使用存储过程和触发器来实现业务需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lilianac

你的鼓励是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值