create procedure p_xsqk @xh char(6)
as select 姓名,课程号,成绩 from xsqk , xs_kc
where xsqk.学号=xs_kc.学号 and xsqk.学号= @xh
go
执行:
exec p_xsqk ‘020102‘ --(1)按位置传递参数 exec p_xsqk @xh=‘020103‘ --(2)通过参数名传递参数注意:因输入参数没有默认值,所以不能用“exec p_xsqk”
6.1.5 使用输出参数
语法:
create proc[edure] 存储过程名
@形参 数据类型 output ,…n
as SQL语句
执行:
[execute] 存储过程名 @实参 output ,…n
说明:
1.输出实参和输出形参的名字可以相同,也可以不同。
2.使用时,要先声明输入和输出实参变量。
操作:创建1个带有输入参数和输出的存储过程p_kh,返回指定教师(作为输入参数)所授课程的课程号(作为输出参数)。
create procedure p_kh
@teacher char(8) , @kch char(3) output
as
select @kch = 课程号 from kc where 授课教师= @teacher
go
执行:
declare @teacher varchar(8), @kch char(3) set @teacher='赵怡' exec p_kh @teacher, @kch output print @teacher + ‘教师所受课程的课程号为:’ + @kch
6.1.6 使用返回值
语法:
return 整型表达式
作用:用于显示存储过程的执行情况
执行:
[execute] @状态值=存储过程名
操作:创建并执行存储过程p_find,用于查找指定的学生,如果找到,则返回数字1,否则返回0。
create procedure p_find
@findname char(8)
as
if exists (select * from xsqk
where 姓名=@findname)
return 1
else
return 0 执行:
declare @result int
exec @result=p_find ‘陈伟‘
if @result =1
print ‘有这个人!‘
else
print ‘ 没有这个人!
6.1.7 删除存储过程
语法:drop proc[edure] 存储过程名
6.1.8 查看存储过程
语法:
sp_help 存储过程名 --显示存储过程的基本信息
sp_helptext 存储过程名 --显示存储过程的源代码
6.1.9 修改存储过程
语法:
alter proc[edure] 存储过程名
[@形参 数据类型 [=默认值] [output ],…n ]
as SQL语句
注意:
1.修改存储过程的定义后,原存储过程的权限设置仍有效
2.如果采用先删除存储过程再重建同名存储过程的方法,那么在原来存储过程上设置的权限将会全部丢失。
6.2 触发器
触发器就是是一种表或视图执行insert、 delete、update操作时,被系统自动执行的特殊的存储过程。
6.2.1 创建触发器
语法:
create trigger 触发器名
on 表名| 视图名
for | after | instead of [ insert , update, delete ]
as SQL语句
注意:1个表上可有多个触发器。 每个触发器只能作用在一个表上。这是一个一对多的关系
6.2.1.1 创建insert触发器
操作:在xscj库的xs_kc表上创建1个名为tr_insert_cj的触发器,当向xs_kc表进行插入操作时激发该触发器,并给出提示信息“有新成绩插入到xs_kc表中!”
create trigger tr_insert_cj
on xs_kc after insert
as print ‘有新成绩信息插入到xs_kc表! ’
go 执行下面这条语句后会触发insert触发器
insert into xs_kc values( '020105', '101', 87, null )
6.2.1.2 创建update触发器
操作:在student表上创建名为tr_update_xsqk2的触发器,当对该表的“姓名”列修改时激发该触发器,使用户不能修改“姓名”列。
create trigger tr_update_xsqk2 on student after update
as
if update(姓名)
begin
rollback transaction -- 撤消修改操作
raiserror(‘不能修改学生姓名!’ , 16 ,1)
end
go
执行下面这条语句后会触发update触发器
update student set 姓名=‘小花’ where 姓名=‘杨颖’
6.2.1.3 创建delete触发器
操作:在xscj库的xsqk表上创建1个名为tr_delete_xsqk的触发器,当要删除指定学号的行时,激发该触发器,撤消删除操作,并给出提示信息“不能删除xsqk表中的信息
create trigger tr_delete_xsqk
on xsqk
after delete
as
rollback transaction
print ‘不能删除xsqk表中的信息!’
go
执行下面这条语句会触发delete触发器
delete xsqk where 学号= '020101'
6.2.2 更新触发器
语法:
alter trigger 触发器名
6.2.3 删除触发器
语法:
drop trigger 触发器名[,…n]
on {database | all server}
参考资料
《数据库原理及应用》 课件
总结
不得不说,课件上有很多错误。起的名字还是拼音简写,⊙ ⊙b汗!。改了一部分,还有部分没改。个人觉得课堂上学道的东西不会太多,还是自己多动手比较好。像我这样把课件给整理一遍,估计整个计算机系再也找不出来第二个这样的奇葩了~O(∩_∩)O哈哈~