mysql——存储过程简介
- 是一组为了完成特定功能的SQL语句集合
- 比传统SQL速度更快、执行效率更高
- 存储过程的优点
- 执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率
- SQL语句加上控制语句的集合,灵活性高
- 在服务器端存储,客户端调用时,降低网络负载
- 可多次重复被调用,可随时修改,不影响客户端调用
- 可完成所有的数据库操作,也可控制数据库的信息访问权限
1. 创建存储过程
- 使用create procedure 语句创建存储过程
创建存储过程的语法结构
CREATE PROCEDURE <过程名> ( [过程参数[,…] ] ) <过程体>
[过程参数[,…] ] 格式
[ IN | OUT | INOUT ] <参数名> <类型>
参数分为
- 输入参数:IN
- 输出参数:OUT
- 输入/输出参数:INOUT
2. 过程体
- 存储过程的主体部分,被称为过程体
- 以BEGIN开始,以END结束,若只有一条SQL语句,则可以省略BEGIN-END
- 以DELIMITER 开始和结束
mysql> DELIMITER $$ //$$是用户自定义的结束符
//省略存储过程其他步骤
mysql> DELIMITER ; //分号前有空格
3. 修改存储过程
- 存储过程的修改分为特征修改和内容修改
特征修改的方法
ALTER PROCEDURE <过程名> [ <特征> … ]
- 内容修改可先删除原有存储过程,之后再创建的方法
特征指定了存储过程的特性,可能的取值有:
- CONTAINS SQL 表示子程序包含 SQL 语句,但不包含读或写数据的语句。
- NO SQL 表示子程序中不包含 SQL 语句。
- READS SQL DATA 表示子程序中包含读数据的语句。
- MODIFIES SQL DATA 表示子程序中包含写数据的语句。
- SQL SECURITY { DEFINER |INVOKER } 指明谁有权限来执行。
- DEFINER 表示只有定义者自己才能够执行。
- INVOKER 表示调用者可以执行。
- COMMENT ‘string’ 表示注释信息。
更具体的语法可以通过mysql命令’help alter procedure’查看, 其他命令的查看也可以使用help命令查询
4. 删除存储过程
- 删除存储过程的语法
DROP { PROCEDURE | FUNCTION } [ IF EXISTS ] <过程名>
- 删除的具体用法
mysql> DROP PROCEDURE PlayerRole;
Query OK, 0 rows affected (0.00 sec)
mysql> CALL PlayerRole;
ERROR 1305 (42000): PROCEDURE test.PlayerRole does not exist
5. 格式
6. 案例
mysql> delimiter $$
mysql> create procedure myrole()
-> begin
-> select name,score from info;
-> end $$
Query OK, 0 rows affected (0.01 sec)
mysql> delimiter ;
mysql> show procedure status where db='auth'\G;
*************************** 1. row ***************************
Db: auth
Name: myrole
Type: PROCEDURE
Definer: root@localhost
Modified: 2020-08-25 19:56:02
Created: 2020-08-25 19:56:02
Security_type: DEFINER
Comment:
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
1 row in set (0.00 sec)
ERROR:
No query specified
################ 修改存储过程 ##########################
mysql> alter procedure myrole modifies sql data sql security invoker;
Query OK, 0 rows affected (0.00 sec)
mysql> show create procedure myrole\G;
*************************** 1. row ***************************
Procedure: myrole
sql_mode: PIPES_AS_CONCAT,ANSI_QUOTES,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Create Procedure: CREATE DEFINER="root"@"localhost" PROCEDURE "myrole"()
MODIFIES SQL DATA
SQL SECURITY INVOKER
begin
select name,score from info;
end
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
1 row in set (0.01 sec)
ERROR:
No query specified
mysql>