`

MySQL 存储过程参数用法 in, out, inout

阅读更多

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     |
+--------+


drop procedure if exists pr_param_inout;

create procedure pr_param_inout
(
   out id int
)
begin
   select id as id_inner_1;  -- id 值为调用者传进来的值

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 |
+------------+
|       NULL |
+------------+

mysql>
mysql> select @id as id_out;
+--------+
| id_out |
+--------+
| NULL   |
+--------+


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

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



通过以上内容我们可以看到mysql存储过程参数in,out,inout的用法,但是out参数还是要慎用,因为out和inout和c语言的引用参数传递很像,如果使用参数是呕吐类型的存储过程,存储过程首先把传入的参数只变成null,out和inout参数使用时会改变外部参数的值
分享到:
评论

相关推荐

    mysql存储过程之返回多个值的方法示例

    要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程。咱们先来看一个orders表它的结构: mysql> desc orders; +----------------+-------------+------+-----+---------+-------+ | Field | Type |...

    mysql存储过程教程

    总结,MySQL的存储过程是提升数据库管理效率的重要工具,掌握其使用方法和最佳实践对于数据库设计和开发人员至关重要。通过学习和实践,你可以更好地利用存储过程来优化数据处理流程,提高系统性能。

    java调用存储过程(含out参数)

    4. **设置IN参数**:如果存储过程有`IN`参数,使用`setXXX()`方法(这里的`XXX`根据参数类型选择,如`setString()`, `setInt()`等)设置参数值。这些参数通常是输入数据,对存储过程进行操作。 5. **设置OUT参数**...

    MySQL 存储过程

    MySQL存储过程支持三种类型的参数:IN、OUT 和 INOUT。 1. **IN 参数** - 定义:表示输入参数,即调用存储过程时必须传递给它的值。 - 特性:在存储过程中修改IN参数的值不会被返回到调用程序。 - 示例: ```...

    MySQL 存储过程入门到精通

    在这个“MySQL存储过程入门到精通”资料中,你将深入理解存储过程的原理、创建、调用以及优化方法。 一、存储过程的基本概念 存储过程是由一系列SQL语句组成的程序,存储在数据库服务器上,可以被多次调用执行,...

    MYSQL存储过程教程

    MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者预定义一组SQL语句,并将其封装成一个可重复使用的单元。这个教程将深入讲解如何在MySQL中创建、调用和管理存储过程,以及它们在实际应用中的价值。 ...

    mysql存储过程实例

    MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者预定义一组SQL语句,然后作为一个单元来执行。在MySQL 5.0版本之后,存储过程得到了广泛的支持,为数据库操作提供了许多优势,如提高性能、增强安全性...

    mybatis调用mysql存储过程

    - 参数模式有IN、OUT、INOUT三种,根据存储过程的参数类型正确设置。 通过以上步骤,你已经掌握了如何在MyBatis中调用MySQL存储过程的基本方法。在实际开发中,这将极大地提升你的数据库操作效率,使你能够更好地...

    MySql 分页存储过程以及代码调用

    本篇文章将深入探讨MySQL中的分页存储过程及其代码调用方法。 首先,理解分页的基本概念。在网页或应用程序中,我们通常会看到“上一页”、“下一页”这样的导航,这就是分页的表现形式。分页查询通过设置每页显示...

    Mysql存储过程和函数

    本文将详细介绍MySQL存储过程与函数的相关概念、创建方法以及使用技巧。 #### 二、存储过程与函数的区别 - **存储过程**(Stored Procedure):是一系列SQL语句的集合,它可以接受输入参数并返回多个结果集和...

    在MySQL中创建带有IN和OUT参数的存储过程的方法

    在MySQL中,存储过程是一种预编译的SQL语句集合,它们可以包含输入(IN)、输出(OUT)以及输入/输出(INOUT)参数,用于封装和重用复杂的数据库操作。本文将详细介绍如何在MySQL中创建带有IN和OUT参数的存储过程。 ...

    精通MySQL存储过程和函数

    以上内容概述了MySQL存储过程和函数的基本概念、创建方法、变量定义、条件处理、流程控制、游标使用、预处理语句以及常见问题。通过这些知识点的学习,可以帮助开发者更好地理解和应用MySQL存储过程和函数,从而提高...

    MySQL存储过程实例教程.doc

    本教程将详细介绍 MySQL 存储过程的概念、优点、创建和使用方法。 1. 存储过程简介 存储过程是数据库存储的一个重要的功能,它是一组为了完成特定功能的 SQL 语句集,经编译后存储在数据库中,用户通过指定存储...

    Java调用存储过程--传入集合参数

    此过程涉及使用`StructDescriptor`和`ArrayDescriptor`创建描述符,然后使用这些描述符构建`STRUCT`和`ARRAY`对象,最终作为参数传递给存储过程。 ```java private static ARRAY getOracleArray(Connection con, ...

    mysql存储过程

    MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者预编译一系列SQL语句并封装成一个可重复使用的单元。这种技术在处理复杂的业务逻辑、提高数据操作效率以及减少网络通信量方面具有显著优势。本篇文章将...

    Java调用数据库存储过程[mysql测试通过]

    IN参数使用setXXX()方法,OUT或INOUT参数需要先设置一个初始值,再使用registerOutParameter()方法指定参数索引和类型。 5. 执行存储过程:调用CallableStatement的execute()方法。 6. 获取结果:如果是查询型存储...

    MySQL存储过程入门学习

    通过本文的学习,我们了解了MySQL存储过程的基础概念、创建方法、调用方式以及如何使用参数来增强其灵活性和功能性。存储过程不仅可以帮助开发者简化复杂操作,还能提高应用程序的性能和安全性。随着进一步的学习和...

    mysql存储过程资料

    CREATE PROCEDURE sp_name ([IN|OUT|INOUT] 参数名 参数类型 [, ...]) BEGIN -- SQL 语句和过程控制语句 END; ``` 例如: ```sql CREATE PROCEDURE sp_name () BEGIN -- 过程体 END; ``` #### 2. 调用存储过程 ...

Global site tag (gtag.js) - Google Analytics