目录
1. 存储过程概述
MySQL
从 5.0
版本开始支持存储过程,存储过程能够将复杂的 SQL
逻辑封装在一起,而应用程序无须关注存储过程内部复杂的 SQL
逻辑,而只需要简单地调用存储过程即可
存储过程的英文是 Stored Procedure
。它的思想很简单,就是一组经过预先编译的 SQL
语句的封装
1.1. 存储过程的执行
执行过程:存储过程预先存储在 MySQL
服务器上,需要执行的时候,客户端只需要向 MySQL
服务器发出调用存储过程的命令,MySQL
服务器就可以把预先存储好的这一系列 SQL
语句全部执行
存储过程的好处
- 简化操作,提高了
SQL
语句的重用性,减少了开发程序员的压力 - 减少操作过程中的失误,提高效率
- 减少网络传输量(客户端不需要把所有的
SQL
语句通过网络发给服务器) - 减少了
SQL
语句暴露在外的风险,也提高了数据查询的安全性
2. 创建存储过程
2.1. 参数类型
存储过程的参数类型可以是 IN、OUT
和 INOUT
- 没有参数:表示无参数无返回
- 仅仅带
IN
类型:表示有参数无返回 - 仅仅带
OUT
类型:表示无参数有返回 - 既带
IN
又带OUT
: 表示有参数有返回 - 带
INOUT
:表示有参数有返回
注意:IN、OUT、INOUT
都可以在一个存储过程中带多个
2.2. 语法结构
创建存储过程的语法
CREATE PROCEDURE 存储过程名
(IN|OUT|INOUT 参数名 参数类型,...)
[characteristics ...]
BEGIN
存储过程体
END
2.2.1. 语法结构说明
- 参数前面的关键字
关键字 | 作用 |
---|---|
IN |
当前参数为输入参数,也就是表示入参; 存储过程只是读取这个参数的值。如果没有定义参数种类, 默认就是 IN ,表示输入参数 |
OUT |
当前参数为输出参数,也就是表示出参; 执行完成之后,调用这个存储过程的客户端或者应用程序就可以读取这个参数返回的值了 |
INOUT |
当前参数既可以为输入参数,也可以为输出参数 |
- 形参类型可以是
MySQL
数据库中的任意类型 characteristics
:表示创建存储过程时指定的对存储过程的约束条件,其取值信息如下
LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT ‘string’
参数 | 说明 |
---|---|
LANGUAGE SQL |
说明存储过程执行体是由SQL 语句组成的,当前系统支持的语言为SQL |
[NOT] DETERMINISTIC |
指明存储过程执行的结果是否确定。DETERMINISTIC 表示结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出。NOT DETERMINISTIC 表示结果是不确定的,相同的输入可能得到不同的输出。如果没有指定任意一个值,默认为NOT DETERMINISTIC |
{ CONTAINS SQL |NO SQL |READS SQL DATA |MODIFIES SQL DATA } |
指明子程序使用SQL语句的限制:CONTAINS SQL 表示当前存储过程的子程序包含SQL 语句,但是并不包含读写数据的SQL 语句;NO SQL 表示当前存储过程的子程序中不包含任何SQL 语句;READS SQL DATA 表示当前存储过程的子程序中包含读数据的SQL 语句;MODIFIES SQL DATA 表示当前存储过程的子程序中包含写数据的SQL 语句。默认情况下,系统会指定为 CONTAINS SQL |
SQL SECURITY { DEFINER |INVOKER } |
执行当前存储过程的权限,即指明哪些用户能够执行当前存储过程。DEFINER 表示只有当前存储过程的创建者或者定义者才能执行当前存储过 |