数据库存储过程&函数&触发器

存储过程

存储过程和函数类似于C语言里的函数
在存储过程中有输入参数,输出参数


共有三步:

  1. 创建存储过程
  2. 执行存储过程
  3. 删除存储过程

创建

create proc proc_name -- 创建执行过程的名字,proc 可以写成procedure
@param1 type,		-- 输入参数,需要对应实参
@param2 type,
@param3 type out  -- 输出参数
as
begin
	sql 执行体
end -- 输入输出参数都可以没有

实例:查询指定学号学生的平均成绩,并将平均成绩返回

create proc proc_avggrade
@sno varchar(10),
@savg int out -- 带out的是相当于返回值
as
begin
	select @savg = avg(grade)
	from sc
	where sno = @sno
end

执行

declare @param1 type, @param2 type, @param3 type
set @param1 = values1
set @param2 = valuse2
-- @params 没赋值,因为会被返回值覆盖
exec proc_name @param1, @param2, @param3 out-- 对应创建的模板,输入输出实参也可以没有(如果定义时候没有的话)
select @param3 -- 查询结果

实例:执行上面创建好的存储过程

declare @sno varchar(10), @savg int
set @sno = '201215121'
exec proc_avggrade @sno, @savg -- exec可以写成execute
select @savg -- 查看的话要写这句查询

删除

drop procedure proc_name

实例:删除上面的存储过程

drop procedure proc_avggrade;

函数

函数分为三种:

  1. 标量函数
  2. 内嵌表值函数
  3. 多语句表值函数

标量函数

即返回值是一个值

create function function_name(@param1,@param2)
returns type -- 注意是returns!!,后面跟一个类型 => 返回值类型
as
begin
	sql 执行体
	return val -- 返回一个具体值,要跟上面returns的返回类型对应
end

例子:在这里插入图片描述

create function whichgeneration(@birthday datetime) -- 局部变量@开头,要注意
returns varchar(12)
as
begin
	if year(@birthday) < 1980 -- year取年份的函数
		return "too old";
	else if year(@birthday) < 1990
		return "80s";
	else
		return "90s";
end

内嵌表值函数

返回值是张表

create function schema.func_name(@param1, @param2)
returns table -- 返回表
as
begin
	sql 执行体
	return select....
end0

例子:定义一个函数返回学生的姓名和学号

create function dbo.fun()
returns table
as -- 就一句话可以不写begin end
	return 
		select sno, sname
		from student

多语句表值函数

不常用


触发器

用户定义在关系表上的一类由事件驱动的特殊过程


作用:

  1. 可以对数据库进行级联修改
  2. 实现比check更复杂的约束
  3. 比较数据修改前后的差别
  4. 强制表的修改要合乎业务规则

分类:

  1. delete触发器
  2. insert触发器
  3. update触发器

每个触发器都有两个专用临时表:

  • inserted表
  • deleted表

在这里插入图片描述


语法:

create trigger tri_name
on table_name
after/for/instead of update/delete/insert -- instead of是一起的,表示在操作之前执行,after和for是在执行之后执行
as
begin
	sql执行过程
end

例如:使用delete触发器
当删除表student中的记录时,自动删除sc中对应学号的记录

create trigger tr_student_sc_delete
on student -- 删除student的数据,所以建立在student上
after delete -- 删除之后才执行操作
as
begin
	declare @sno char(10)
	select @sno=deleted.sno -- 被删除的数据会放再deleted表中 
	from delete
	delete from sc
	where sno = @sno
end

PS:当使用instead of时,会在执行操作前执行触发器操作,并且相当于做了拦截,如果想继续操作,需要在触发器执行体中再写一遍


可以使用回滚操作,rollback transaction,之前进行的操作会全部失效

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读