mysql 存储过程
一、概念
存储过程简称过程,procedure,是一种用来处理数据(增删改)的方式。简单点,我们也可以将其理解为没有返回值的函数。
一般存储过程并不显示结果,而是把结果返回给你指定的变量
二、创建过程
基本语法
create procedure 过程名字([参数列表])
begin
-- 过程体
end
如果过程体中只有一条指令,则可以省略 begin 和 end
创建一个完整的存储过程
三、查看过程
查看全部存储过程:show procedure status [like 'pattern'];
查看存储过程的创建语句:show create procedure 过程名字
四、调用过程
- 语法:
call 过程名([实参列表])
因为存储过程实际上是一种函数,所以存储过程名后需要有()符号,即使没有参数也需要()
五、删除过程
语法:drop procedure 过程名
六、存储过程的形参类型
函数的参数需要指定数据类型,过程比函数更加严格。过程有三种自己的参数类型
in
:参数从外部传入到内部,可以是数据或者变量out
:参数从过程里面把数据保存到变量,然后交给外部使用,从外部传入的必须是变量。如果从外部传入的变量本身有值,需要先清空在传入内部inout
:此参数只能传递变量,该变量的值可以给过程内部使用,过程结束后可以变量的值传递给过程外部使用
基本语法
procedure 过程名(in 参数名字 参数类型, out 参数名字 参数类型, inout 参数名字 参数类型)
我们先定义一个简单的过程
delimiter ##
create procedure pro(in var1 int, out var2 int, inout var3 int)
begin
-- 查看该过程传入的三个变量
select var1, var2, var3;
end
##
delimiter ;
-- 调用过程
call pro(1, 2, 3);
在调用该函数的时候出现错误,因为 in 和 out 类型只能接受变量,不能接受具体的数值
因此,我们先定义几个变量,然后再调用
可以看到,传递给 out 类型参数的 @var2 变量在经过过程处理之后,变为了 null,这是因为在 out 修饰的参数中,如果传入的变量有值,也会自动清空为 null。同时在过程内部对变量的值的改变会影响到外部
1.
先来看一个例子
set @no1 = 100;
set @no2 = 200;
set @no3 = 300;
delimiter ##
create procedure pro(in var1 int, out var2 int, inout var3 int)
begin
-- 查看传入的三个变量的值
select var1, var2, var3;
-- 修改三个变量的值
set var1 = 1;
set var2 = 2;
set var3 = 3;
-- 修改后的三个变量的值
select var1, var2, var3;
-- 查看会话变量
select @no1, @no2, @no3;
end
##
delimiter ;
-- 调用改方法
call pro(@no1, @no2, @no3);
如图所示,我们成功创建了该过程
然后我们调用该方法,参数就是之前定义的变量,结果如下。可以看到 in 类型参数在内部改变后,在外部查询还是改变之前的值,out 和 inout 类型参数在内部改变后,外部查询就是改变之后的值。
2.
我们在来看一个例子
set @no1 = 100;
set @no2 = 200;
set @no3 = 300;
delimiter ##
create procedure pro2(in var1 int, out var2 int, inout var3 int)
begin
-- 查看三个传入进来的数据的值
select var1, var2, var3;
-- 修改三个变量的值
set var1 = 1;
set var2 = 2;
set var3 = 3;
-- 查看修改后的三个变量的值
select var1, var2, var3;
-- 查看会话变量
select @no1, @no2, @no3;
-- 修改会话变量
set @no1 = 'a';
set @no2 = 'b';
set @no3 = 'c';
-- 查看修改会话变量之后的值
select @no1, @no2, @no3;
end;
##
delimiter ;
-- 调用过程
call pro2(@no1, @no2, @no3);
我们不仅在内部对传入的参数作了修改,还直接对会话变量作了修改。对应 in 类型参数,只有直接对会话变量进行修改,外部才真查询到修改;out 和 inout 参数若已经通过传入的参数进行修改了,外部查询到的就是对参数修改后的值,就算在内部使用会话变量修改也没有用
总结
- in 类型修饰的变量类似于“值传递”,即传入的只是变量的拷贝,就算在过程里面修改了,那也只是对拷贝的变量进行修改,原来的变量的值依然没有修改
- out 和 inout 类型修饰的变量也同样是 “值传递”,和 in 不同是的,他们是通过引用来传递的,即先拷贝一个引用,指向传入的变量,对变量进行修改。此时变量的修改就会覆盖原来的值
七、过程和函数
相同点
不同点
- 标识符不同,函数是 function,过程是 procedure
- 函数中有返回值,过程没有返回值
- 函数中不能使用 select 语句,而过程可以使用
- 函数最后可以通过 select 语句使用,过程通过 call 语句使用
相关阅读
navicat for mysql 注册码,简简单单,一个搞定
打开navicat for mysql接着打开帮助,选中注册, 把下面的复制上去就可以了 NAVH-WK6A-DMVK-DKW3
善用mysql中的FROM_UNIXTIME()函数和UNIX_TIMESTAMP()
我们经常会面临要从数据库里判断时间,取出特定日期的查询。但是数据库里储存的都是unix时间戳,处理起来并不是特别友好。幸而MYSQL
MySQL免安装版,遇到MSVCR120.dll文件丢失错误的解决方
在进行mysql zip版本的安装时,遇到上图的错误,在网上找了相关的文件拷贝到相应目录下,但还是不行。 后来终于找到解决方法:下载 VC re
在Navicat中进行连接测试时,发现报错2509,还有乱码!mysql 2509 加密方式导致的报错,在8以后的版本默认的加密方式都改为了caching_sha
如果存储过程中含有动态SQL语句,在触发器中调用该存储过程时会报错ERROR 1336 (0A000): Dynamic SQL is not allowed in stored fu