内容正文:
(中职)MySQL 8.0数据库管理与应用第6章教学课件(工信版)
第6章 存储例程
2
6.1.1 创建存储过程
使用CREATE PROCEDURE语句在数据库中创建存储过程:
CREATE
[DEFINER = {用户 | CURRENT_USER }]
PROCEDURE 存储过程名称([参数[, ...]])
[特征 ...] 过程体
参数:
[ IN | OUT | INOUT ] 参数名称 数据类型
特征:
COMMENT '字符串'
| LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
6.1 存储过程
6.1.2 调用存储过程
使用CALL语句调用存储过程:
CALL 存储过程名称[()]
CALL 存储过程名称([参数[, ...]])
CALL语句调用先前使用CREATE PROCEDURE定义的存储过程。默认情况下,CALL语句将调用包含在当前数据库中的存储过程。如果要调用包含在指定数据库中的存储过程,则应以“数据库名称.存储过程名称”格式来指定存储过程。
1. 调用无参存储过程
存储过程名称后面的圆括号可以省略不写。
2. 调用带IN参数的存储过程
将常量、用户变量或其他表达式作为输入参数传入存储过程,然后在存储过程中使用所传入的参数值。在CALL语句中使用的输入参数应与创建存储过程时定义的IN参数数量相同,数据类型一致。
3. 调用带OUT参数和INOUT参数的存储过程
要使用OUT或INOUT参数从存储过程中获取值,可以通过用户变量向存储过程传递参数,并在存储过程返回后检查和使用用户变量的值。
6.1 存储过程
6.1.2 调用存储过程
4. 在预处理语句中调用存储过程
使用预处理语句可以通过以下3个SQL语句来实现。
(1)使用PREPARE语句准备一个SQL语句并为其分配名称,以便稍后引用该语句:
PREPARE stmt_name FROM preparable_stm;
(2)使用EXECUTE语句执行先前通过PREPARE命名的语句:
EXECUTE stmt_name [USING @var_name [, @var_name] ...];
(3)使用DEALLOCATE PREPARE语句解除先前用PREPARE生成的预处理语句,语法格式如下。
{DEALLOCATE | DROP} PREPARE stmt_name
在与PREPARE和EXECUTE一起使用的预处理的CALL语句中,占位符可以用于IN参数、OUT参数和INOUT参数。
6.1 存储过程
6.1.3 修改存储过程
使用ALTER PROCEDURE语句对存储过程的特征进行修改:
ALTER PROCEDURE 存储过程名称 [特征 ...]
特征:
COMMENT '字符串'
| LANGUAGE SQL
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
其中各个特征的作用与CREATE PROCEDURE语句相同。
6.1 存储过程
6.1.4 删除存储过程
使用DROP PROCEDURE语句从数据库中删除存储过程:
DROP PROCEDURE [IF EXISTS] 存储过程名称
这个语句可以用于删除存储过程,即从服务器中删除指定的例程。要使用这个语句,必须拥有该过程的ALTER ROUTINE权限。
如果启用了automatic_sp_privileges系统变量,则在创建过程时会自动将该特权和EXECUTE权限授予过程的创建者,并在过程被删除时从创建者中删除。
IF EXISTS子句是MySQL扩展。如果存储过程不存在,使用该子句可以防止发生错误。
6.1 存储过程
6.2.1 复合语句
编写存储例程时可以使用BEGIN ... END复合语句来包含多个语句:
[开始标签:] BEGIN
[语句列表]
END [结束标签]
其中语句列表可以包含一个或多个语句,每个语句都必须用分号“;”来结束。复合语句可以使用标签来标记。例如:
lable1: BEGIN
USE test;
SHOW TABLES;
...
END label1
使用多重语句需要客户端能发送包含语句定界符“;”的查询字符串。这个符号在命令行客户端被用DELIMITER命令来处理,即对语句结束符“;”进行修改,例如更改