史上最简单的 MySQL 教程(四十四)「存储过程」
2018-02-28 08:47
4051 查看
存储过程
存储过程简称过程,procedure,是一种用来处理数据(增删改)的方式。简单点,我们也可以将其理解为没有返回值的函数。
创建过程
-- 基本语法 create procedure 过程名([参数列表]) begin -- 过程体 end
如果我们定义的过程的过程体内仅含有一条语句,则可以省略
begin和
end。执行如下语句,进行测试:
-- 创建过程 create procedure pro() select * from student;
如上图所示,我们创建了一个名为
pro()的过程,其目的就是为了查询
student表中的数据。但实际上,过程多用于处理数据,查询并不多用。
查看过程
查看过程,基本语法为:show procedure status + [like 'pattern'];
查看过程的创建语句,基本语法为:
show create procedure + 过程名;
调用过程
由于函数有返回值,因此我们可以用select来调用函数。但是存储过程没有返回值,怎么办?实际上,对于存储过程,有一个专门的调用关键字
call,调用过程的基本语法为:
call + 过程名;
修改过程 & 删除过程
过程只能先删除后新增,不能修改。删除过程的基本语法为:drop procedure + 过程名;
执行如下语句,进行测试:
-- 删除过程 drop procedure pro; -- 查看过程 show procedure status like 'pro'\G;
过程参数
函数的参数需要指定数据类型,过程比函数更加严格。过程有三种自己的参数类型,分别为:in,数据只是从过程外部传入给过程内部使用,可以是数值也可以是变量;
out,此参数只能传递变量,且变量指向的数据需要先清空然后才能进入过程内部,该引用供过程内部使用,过程结束后可以将变量的值传递给过程外部使用;
inout,此参数只能传递变量,该变量的值可以给过程内部使用,过程结束后可以变量的值传递给过程外部使用。
因此,过程定义的具体形式应该为:
procedure 过程名(in 参数名字 参数类型, out 参数名字 参数类型, inout 参数名字 参数类型)
下面,我们定义一个简单的过程,并调用过程。代码如下:
delimiter $$ create procedure pro2(in var1 int, out var2 int, inout var3 int) begin -- 查看该过程传入的三个变量 select var1, var2, var3; end $$ delimiter ; -- 调用过程 call pro2(1,2,3);
如上图所示,过程
pro2创建成功。但是,在调用过程的时候出现错误,造成该错误的原因为:过程的
out和
inout两个参数只能接受变量,而我们传递了具体的数值,报错也就在情理之中啦!接下来,执行如下语句,进行测试:
-- 设置全局变量 set @var1 = 1; set @var2 = 2; set @var3 = 3; -- 调用过程 call pro2(@var1, @var2, @var3); -- 查看变量 select @var1, @var2, @var3;
如上图所示,在我们将变量传递给过程的时候,过程正常执行。此外,通过
select语句我们可以看到传递给
out类型参数的
@var2的值在经过过程处理之后,被置为
null值啦,这也是符合
out类型参数的先清空后使用原则的。而且,由于
out和
inout只能接受变量作为参数,因此在过程内部对
out和
inout传入的变量的修改会影响到过程外部。在这里,值得我们注意是:存储过程对变量的操作是滞后的,即只有在过程结束的时候,才会将过程内部修改的值赋值给外部传入的对应的全局变量。执行如下语句,进行测试:
delimiter $$ create procedure pro3(in var1 int, out var2 int, inout var3 int) begin -- 查看该过程传入的三个变量 select var1, var2, var3; -- 修改局部变量 set var1 = 10; set var2 = 20; set var3 = 30; -- 查看局部变量 select var1, var2, var3; -- 查看全局变量 select @var1, @var2, @var3; -- 修改全局变量 set @var1 = 'a'; set @var2 = 'b'; set @var3 = 'c'; -- 查看全局变量 select @var1, @var2, @var3; end $$ delimiter ;
-- 调用过程 call pro3(@var1, @var2, @var3); -- 在过程结束后,查看全局变量 select @var1, @var2, @var3;
如上图所示,存储过程执行成功,且验证了我们结论,即:在存储过程没有结束的时候,对传入变量的修改并不会影响到对应的全局变量;只有在存储过程结束后,才会将对应的变量值赋值给
out和
inout类型的变量,而
in类型的变量不受影响。
温馨提示:符号
[]括起来的内容,表示可选项;符号
+,则表示连接的意思。
———— ☆☆☆ —— 返回 -> 史上最简单的 MySQL 教程 <- 目录 —— ☆☆☆ ————
相关文章推荐
- Mysql创建存储过程的简单实例
- MySQL中的唯一索引的简单学习教程
- Mysqlslap MySQL压力测试工具 简单教程
- MySQL 5.7 版本的安装及简单使用(图文教程)
- 史上最简单的 MySQL 教程(十二)「记录长度」
- 史上最简单的 MySQL 教程(二十三)「数据的高级操作 之 查询(上)」
- Mysql存储过程学习笔记--建立简单的存储过程
- java 调用mysql的存储过程(简单示例)
- MySql基础教程二(视图,存储过程,游标,触发器,事务,权限,数据类型)
- mysql存储过程之一个简单的存储过程
- Qt 4 访问 mysql 数据库的简单教程
- flash+php+mysql打造简单留言本教程第1/3页
- MySQL 触发器 存储过程 自定义函数 视图 简单示例
- Navicat for mysql 简单使用教程
- MySQL 简单操作教程
- 史上最简单的 MySQL 教程(二十四)「数据的高级操作 之 查询(中)」
- 简单的分页存储过程 php mysql mysqli扩展
- 史上最简单的 MySQL 教程(二)「关系型数据库」
- MySQL5.7.16安装教程,以及简单的sql命令介绍
- Mysqlslap 压力测试 简单教程