前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据库原理及应用(八)——变量、存储过程和触发器

数据库原理及应用(八)——变量、存储过程和触发器

作者头像
Regan Yue
发布2023-03-30 15:40:55
3720
发布2023-03-30 15:40:55
举报
文章被收录于专栏:ReganYue's Blog

一、变量

变量分为全局变量和局部变量。

p.s.

  1. 全局变量不能由用户定义,也不能被显式地赋值或声明,其名称以@@开头。
  2. 局部变量有用户自定义,需要用DECLARE声明,局部变量如同它的名字一样,只能在声明该变量的批处理语句或过程体内有效。

二、存储过程

使用存储过程的好处:

  1. 运行效率高
  2. 降低了客户机和服务器之间的通信量
  3. 方便实施企业规则

语句格式:

代码语言:javascript
复制
CREATE PROCEDURE 存储过程名[;版本号]
[{@参数 数据类型} [VARYING] [=默认值] [OUTPUT],...]
[WITH {RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}]
[FOR REPLICATION]
AS 
    SQL语句

例1:创建一个简单的存储过程,用于查看学生表的所有记录

代码语言:javascript
复制
ALTER PROCEDURE EXP1
AS 
	SELECT * FROM s
image.png
image.png

例2:嵌套调用存储过程,求总成绩最高的学生信息:

代码语言:javascript
复制
CREATE PROCEDURE EXP6 @sno1 char(10) OUTPUT
AS 
	SELECT TOP 1 @sno1 = sc.sno
	FROM sc
	GROUP BY sc.sno
	ORDER BY SUM(sc.grade)	DESC
GO
CREATE PROCEDURE EXP7
AS
	DECLARE @sno2 char(10)
	EXECUTE EXP6 @sno2 OUTPUT
	SELECT *
	FROM s
	WHERE sno = @sno2;
GO
image.png
image.png
image.png
image.png

三、触发器

触发器的功能

  • 强化约束
  • 跟踪变化
  • 级联运行
  • 存储过程的调用

例3:利用INSTEAD OF触发器实现级联删除,即若在s表中删除一学生数据,则在sc表中应该同时删除有关学生的成绩信息。

代码语言:javascript
复制
CREATE TRIGGER tr1_S
ON s
INSTEAD OF DELETE
AS 
BEGIN TRANSACTION
	DELETE FROM sc
	WHERE sno IN (SELECT sno FROM DELETED)
	DELETE FROM s
	WHERE sno IN (SELECT sno FROM DELETED)
COMMIT TRANSACTION;

运行结果:

代码语言:javascript
复制
CREATE TRIGGER tr1_S
ON s
INSTEAD OF DELETE
AS 
BEGIN TRANSACTION
	DELETE FROM sc
	WHERE sno IN (SELECT sno FROM DELETED)
	DELETE FROM s
	WHERE sno IN (SELECT sno FROM DELETED)
COMMIT TRANSACTION;
> Affected rows: 0
> 时间: 0.017s
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、变量
  • 二、存储过程
    • 使用存储过程的好处:
    • 三、触发器
      • 触发器的功能
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档