详解MySQL存储过程参数有三种类型(in、out、inout)

 更新时间:2012年07月17日 23:35:39   作者:  
MySQL 存储过程参数有三种类型:in、out、inout。它们各有什么作用和特点呢
一、MySQL 存储过程参数(in)
MySQL 存储过程 “in” 参数:跟 C 语言的函数参数的值传递类似, MySQL 存储过程内部可能会修改此参数,但对 in 类型参数的修改,对调用者(caller)来说是不可见的(not visible)。
复制代码 代码如下:

drop procedure if exists pr_param_in;
create procedure pr_param_in
(
in id int -- in 类型的 MySQL 存储过程参数
)
begin
if (id is not null) then
set id = id + 1;
end if;
select id as id_inner;
end;
set @id = 10;
call pr_param_in(@id);
select @id as id_out;
mysql> call pr_param_in(@id);

+----------+
| id_inner |
+----------+
| 11 |
+----------+
mysql> select @id as id_out;
+--------+
| id_out |
+--------+
| 10 |
+--------+
可以看到:用户变量 @id 传入值为 10,执行存储过程后,在过程内部值为:11(id_inner),但外部变量值依旧为:10(id_out)。

二、MySQL 存储过程参数(out)
MySQL 存储过程 “out” 参数:从存储过程内部传值给调用者。在存储过程内部,该参数初始值为 null,无论调用者是否给存储过程参数设置值。
复制代码 代码如下:

drop procedure if exists pr_param_out;
create procedure pr_param_out
(
out id int
)
begin
select id as id_inner_1; -- id 初始值为 null
if (id is not null) then
set id = id + 1;
select id as id_inner_2;
else
select 1 into id;
end if;
select id as id_inner_3;
end;
set @id = 10;
call pr_param_out(@id);
select @id as id_out;
mysql> set @id = 10;
mysql>
mysql> call pr_param_out(@id);

+------------+
| id_inner_1 |
+------------+
| NULL |
+------------+
+------------+
| id_inner_3 |
+------------+
| 1 |
+------------+
mysql> select @id as id_out;
+--------+
| id_out |
+--------+
| 1 |
+--------+
可以看出,虽然我们设置了用户定义变量 @id 为 10,传递 @id 给存储过程后,在存储过程内部,id 的初始值总是 null(id_inner_1)。最后 id 值(id_out = 1)传回给调用者。

三、MySQL 存储过程参数(inout)
MySQL 存储过程 inout 参数跟 out 类似,都可以从存储过程内部传值给调用者。不同的是:调用者还可以通过 inout 参数传递值给存储过程。
复制代码 代码如下:

drop procedure if exists pr_param_inout;
create procedure pr_param_inout
(
inout id int
)
begin
select id as id_inner_1; -- id 值为调用者传进来的值
if (id is not null) then
set id = id + 1;
select id as id_inner_2;
else
select 1 into id;
end if;
select id as id_inner_3;
end;
set @id = 10;
call pr_param_inout(@id);
select @id as id_out;
mysql> set @id = 10;
mysql>
mysql> call pr_param_inout(@id);

+------------+
| id_inner_1 |
+------------+
| 10 |
+------------+
+------------+
| id_inner_2 |
+------------+
| 11 |
+------------+
+------------+
| id_inner_3 |
+------------+
| 11 |
+------------+
mysql>
mysql> select @id as id_out;
+--------+
| id_out |
+--------+
| 11 |
+--------+
从结果可以看出:我们把 @id(10),传给存储过程后,存储过程最后又把计算结果值 11(id_inner_3)传回给调用者。 MySQL 存储过程 inout 参数的行为跟 C 语言函数中的引用传值类似。

通 过以上例子:如果仅仅想把数据传给 MySQL 存储过程,那就使用“in” 类型参数;如果仅仅从 MySQL 存储过程返回值,那就使用“out” 类型参数;如果需要把数据传给 MySQL 存储过程,还要经过一些计算后再传回给我们,此时,要使用“inout” 类型参数。

相关文章

  • mysql where中如何判断不为空的实现

    mysql where中如何判断不为空的实现

    本文主要介绍了mysql where中如何判断不为空的实现,本文将针对这些空演示如何判断是否为空,以及如何写sql过滤,包括使用判空函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-03-03
  • MYSQL多表联查on和where的区别小结

    MYSQL多表联查on和where的区别小结

    在使用left join时过滤条件放到on后面还是where后面是有区别的,如果没有搞清楚他们的区别,连表汇总的结果就会变少或者变多,本文就来详细介绍一下两者的区别,感兴趣的可以了解一下
    2023-11-11
  • mysql开启远程连接(mysql开启远程访问)

    mysql开启远程连接(mysql开启远程访问)

    开启MYSQL远程连接权限的方法,大家参考使用吧
    2013-12-12
  • mysql如何用sql语句建立学生课程数据库基本表

    mysql如何用sql语句建立学生课程数据库基本表

    这篇文章主要给大家介绍了关于mysql如何用sql语句建立学生课程数据库基本表的相关资料,学生表是一个常见的数据表,用于存储学生的个人信息和成绩等相关数据,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • 你真的会用Mysql的explain吗

    你真的会用Mysql的explain吗

    explain显示了mysql如何使用索引来处理select语句以及连接表,可以帮助选择更好的索引和写出更优化的查询语句,下面这篇文章主要给大家介绍了关于Mysql中explain用法的相关资料,需要的朋友可以参考下
    2022-03-03
  • node 多种方法连接mysql数据库(最新推荐)

    node 多种方法连接mysql数据库(最新推荐)

    mysql是一个流行的第三方模块,可以通过npm安装,在Node.js 中,有多种方法可以连接 MySQL 数据库,本文通过实例代码讲解node 多种方法连接mysql数据库的示例代码,感兴趣的朋友跟随小编一起看看吧
    2023-07-07
  • MySQL空间函数ST_Distance_Sphere()的使用方式

    MySQL空间函数ST_Distance_Sphere()的使用方式

    这篇文章主要介绍了MySQL空间函数ST_Distance_Sphere()的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • MySQL中参数sql_safe_updates在生产环境的使用详解

    MySQL中参数sql_safe_updates在生产环境的使用详解

    这篇文章主要给大家介绍了关于MySQL中参数sql_safe_updates在生产环境使用的相关资料,并给大家分享了解决mysql sql_safe_updates不支持子查询更新的方法,分享出来供大家参考学习,需要的朋友们下面来一起看看吧。
    2017-11-11
  • Mysql单表访问方法图文示例详解

    Mysql单表访问方法图文示例详解

    这篇文章主要为大家介绍了Mysql单表访问方法图文示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • MySQL表的基本查询详细图文教程

    MySQL表的基本查询详细图文教程

    这篇文章主要给大家介绍了关于MySQL表的基本查询的相关资料,需要的朋友可以参考下
    2024-10-10

最新评论