存储过程是为了完成特定功能汇集而成的一组已命名的 SQLSQL 语句集合,该集合编译后存放在数据库中,可根据实际情况重新编译。

# 使用优点

  • 将业务操作封装
  • 便于事务管理
  • 实现一定程度的安全性保护
    • 对存储过程只授予执行权限,不需授予表或视图的操作权限
  • 减少网络通信量
  • 特别适合统计和查询操作

# 存储过程代码

# 创建存储过程

SQL
1
2
3
4
5
6
CREATE PROCEDURE 存储过程名
[
参数 [OUTPUT], ...
]
AS
操作

# 存储过程的执行

SQL
1
2
DECLARE @变量名
EXECUTE 存储过程名 传入参数1, @变量名 OUTPUT

# 存储过程的修改和删除

# 修改

SQL
1
2
3
ALTER PROCEDURE 存储过程名
AS
操作

存储过程是在服务器端执行,因此程序中不需要有输出命令。 SELECT 引出的输出不会在客户端实现

# 删除

SQL
1
DROP PROCEDURE 存储过程名

# 存储过程模板

SQL
1
2
3
4
5
CREATE PROCEDURE 存储过程名(@变量名1 数据类型1, ..., @变量名i 数据类型i OUTPUT)
AS
BEGIN
一些操作
END

# 存储过程实例

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
-- sno 是传入参数
-- avg 可以理解成传入一个引用, 在存储过程中,赋值
CREATE PROCEDURE process(@sno CHAR(7), @avg NUMERIC(6, 2) OUTPUT)
AS
BEGIN
DECLARE @sName VARCHAR(20), @cName VARCHAR(20)
DECLARE @score TINYINT, @sum INT, @count TINYINT

SELECT @sum = 0.0, @count = 0.0

DECLARE cur CURSOR FOR
SELECT studentName, courseName, score
FROM Score a, Student b, Course c
WHERE b.studentNo = @sNo
AND a.studentNo = b.studentNo AND a.courseNo = c.courseNo

OPEN cur
FETCH cur INTO @sName, @cName, @score
WHILE (@@FETCH_STATUS = 0)
BEGIN
SELECT @sName, @cName, @score
SET @sum = @sum + @score
SET @count = @count + 1
FETCH cur INTO @sName, @cName, @score
END

CLOSE cur
DEALLOCATE cur

IF @count = 0
SET @avg = 0
ELSE
SET @avg = @sum / @count
END