数据库原理与应用 第 15 章 · 第六节
课程 › 第 15 章 › 第六节 创建特征例子与调用 版式
第 15 章 存储过程与函数 · 第六节

创建和调用存储过程

CREATE PROCEDURE 的语法和特征,两个例子,用 CALL 调用
本 节 知 识 点
  1. 23创建存储过程
  2. 24存储过程的特征
  3. 25两个例子与调用
23
第 15 章 · 第六节 · 课件第 52、53、54 页合并重做

创建存储过程

CREATE PROCEDURE 过程名(参数) 特征 过程体。

15.4 存储过程课件第 52、53、54 页合并

创建存储过程

创建存储过程有两种方法:在代码窗口中执行 CREATE PROCEDURE 语句,或者使用 Workbench 的菜单。

CREATE [DEFINER = 用户] PROCEDURE 过程名([参数[, …]]) [特征 …] BEGIN 过程体 END
参数的格式
[IN | OUT | INOUT] 参数名 类型
  • IN 输入、OUT 输出、INOUT 输入输出,省略时为 IN
  • 可以没有参数,但括号不能省略
注意
  • 过程建在当前数据库中,也可以写成 数据库名.过程名
  • 过程体有多条语句时,先用 DELIMITER 改定界符
  • Workbench 中右击 Stored Procedures,选 Create Stored Procedure,写好过程体后单击 Apply

创建存储过程要有 CREATE ROUTINE 权限。

重 点

参数表可以为空,但过程名后面的括号不能省略。

24
第 15 章 · 第六节 · 课件第 55、56 页合并重做

存储过程的特征

数据访问方式、安全类型和注释,都可以省略。

15.4 存储过程课件第 55、56 页合并

存储过程的特征

特征含义
LANGUAGE SQL过程体用 SQL 编写,是默认值
[NOT] DETERMINISTIC相同的输入是否总得到相同的结果,默认为 NOT DETERMINISTIC
CONTAINS SQL包含 SQL 语句,但不读写数据,是默认值
NO SQL不包含 SQL 语句
READS SQL DATA包含读数据的语句
MODIFIES SQL DATA包含修改数据的语句
SQL SECURITY DEFINER执行时检查定义者的权限,是默认值
SQL SECURITY INVOKER执行时检查调用者的权限
COMMENT '说明'注释信息,省略时为空
  • 特征都可以省略,写几个时用空格或换行分开
  • 中间四个表示过程怎样使用数据,四个中选一个。MySQL 不检查它与过程体是否一致,由编写者如实声明

分清楚

特征默认值
数据访问CONTAINS SQL
安全类型DEFINER
确定性NOT DETERMINISTIC
25
第 15 章 · 第六节 · 课件第 57、58、59、60 页合并重做

两个例子与调用

建好后用 CALL 过程名() 调用。

15.4 存储过程课件第 57、58、59、60 页合并

两个例子与调用

例 15-10 学生人数,不带参数
DELIMITER $$
CREATE PROCEDURE showstudentsnums()
BEGIN
  SELECT COUNT(*) AS 学生人数 FROM s;
END $$
DELIMITER ;
CALL showstudentsnums();
例 15-11 每人的选课门数
DELIMITER $$
CREATE PROCEDURE cal_courses()
BEGIN
  SELECT s.sno, s.sn,
         courses.num AS 选课门数
  FROM s LEFT JOIN
    (SELECT sno, COUNT(*) AS num
     FROM sc GROUP BY sno) AS courses
  ON s.sno = courses.sno;
END $$
DELIMITER ;
CALL cal_courses();
调用存储过程
CALL 过程名([实参[, …]]);
  • 无参过程可以写成 CALL 过程名; 或 CALL 过程名();
在 Workbench 中
  • 左侧展开 teaching 下的 Stored Procedures,把鼠标指向过程,单击出现的执行图标
  • 例 15-11 中没有选课的 s6,选课门数显示为 NULL
保山学院·人工智能教研室·曹鼎鼎