`
dishell
  • 浏览: 66607 次
  • 性别: Icon_minigender_1
  • 来自: 西安
最近访客 更多访客>>
社区版块
存档分类
最新评论

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存储过程参数有三种类型(in、out、inout)

    MySQL 存储过程参数有三种类型:in、out、inout。它们各有什么作用和特点呢

    mysql数据存储过程参数实例详解

    MySQL 存储过程参数有三种类型:in、out、inout。它们各有什么作用和特点呢? 一、MySQL 存储过程参数(in) MySQL 存储过程 “in” 参数:跟 C 语言的函数参数的值传递类似, MySQL 存储过程内部可能会修改此参数...

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

    在MySQL 入门教程中,我们能够看到很多关于如何创建储存过程 和如何利用 IN 和 OUT 参数调用存储过程的示例。这些示例都很简单,能够很好的帮助你理解 MySQL 中创建带参数存储过程的语法。这些示例已在 MySQL 5.5 中...

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

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

    MySQL数据库:存储过程的创建1.pptx

    使用存储过程的优点有: (1)存储过程在服务器端运行,执行速度快。 (2)存储过程执行一次后,其执行规划就驻留在高速缓冲存储器,在以后的操作中,只需从高速缓冲存储器中调用已编译好的二进制代码执行,提高了...

    MySQL存储过程的深入讲解(in、out、inout)

    一、简介 从 5.0 版本才开始支持,是一组为了完成特定...为什么要用存储过程? 1.减轻网络负载;2.增加安全性 二、创建存储过程 2.1 创建基本过程 使用create procedure语句创建存储过程 存储过程的主体部分,被称为

    所有数据库存储过程in,out和java匹配对应字段

    oracle ,mysql ,db2,等多数据库 存储过程 out 和java 匹配的字段

    VB采用ADO连MySql数据库及调用存储过程

    VB6通过ADO连MySql数据库,调用带参数的存储过程。

    MySQL数据库:存储过程嵌套.pptx

    创建另外一个存储过程sell_update,在其中调用第一个存储过程,如果给定参数为0,则修改由第一个存储过程插入记录的是否发货字段为'已发货',如果给定参数为1则删除第一个存储过程插入的记录,并将操作结果输出。...

    MySQL存储过程和函数使用总结

     存储过程和函数的区别在于函数必须有返回值,而存储过程没有,存储过程的参数可以使用IN、OUT、INOUT类型,而函数的参数只能是IN类型的。如果有函数从其他类型的数据库迁移到MySQL,那么可能因此需要将函数改造成...

    MYSQL

    10.6 选择一种表类型 10.6.1 静态(定长)表的特点 10.6.2 动态表的特点 10.6.3 压缩表的特点 10.6.4 内存(In-memory table)表的特点 10.7 其他优化技巧 10.8 使用你自己的基准测试 ...

    MYSQL存储过程即常用逻辑知识点总结

    Mysql存储过程 1.创建存储过程语法(格式) DELIMITER $ CREATE PROCEDURE 存储过程名A(IN 传入参数名a INT,IN 传入参数名b VARCHAR(20),OUT 返回参数名c INT) BEGIN  内容.......... END $ 解析: IN 代表...

    MySQL中文参考手册

    o 4.16 升级和降级(downgrading)时有什么特别要做的事情吗? + 4.16.1 从一个 3.22 版本升级到 3.23 + 4.16.2 从一个 3.21 版本升级到 3.22 + 4.16.3 从一个 3.20 版本升级到 3.21 + 4.16.4 升级到其他的...

    mysql技巧总结大全

    由括号包围的参数列必须总是存在 如果没有参数 也该使用一个空参数列 每个参数默认都是一个IN参数 要指定为其它参数 可在参数名之前使用关键词 OUT或INOUT 在mysql客户端定义存储过程的时候使用delimiter命令来把...

    mysql存储过程快速了解

    整篇文章为个人学习心得,之后会持续发表mysql高级进阶,javaweb框架等知识点文章,制作不易,加个关注 存储过程 优点: 提高开发效率,提高应用程序的性能,简化程序开发人员的操作,减少应用程序和是数据库服务器...

    MySQL中文参考手册.chm

    10.6 选择一种表类型 10.6.1 静态(定长)表的特点 10.6.2 动态表的特点 10.6.3 压缩表的特点 10.6.4 内存(In-memory table)表的特点 10.7 其他优化技巧 10.8 使用你自己的基准测试...

    MySQL存储过程及常用函数代码解析

    存储过程可以有多个in,out,inout参数,而函数只有输入参数类型,而且不能带in. 存储过程实现的功能要复杂一些;而函数的单一功能性(针对性)更强。 存储过程可以返回多个值;存储函数只能有一个返回值。 存储...

    mysql 存储过程输入输出参数示例

    drop PROCEDURE if exists my_procedure; create PROCEDURE my_procedure(in my_id int,out my_name... 您可能感兴趣的文章:Mysql存储过程循环内嵌套使用游标示例代码MySQL 存储过程中执行动态SQL语句的方法Mysql存储过

    MySQL 存储过程、自定义函数 和 流程控制( if 、case 、loop、leave、iterate 、repeat 和 while )的语法、创建和使用

    文章目录一、存储过程1.1、语法:1.2、示例1.2.1、无参数的存储过程1.2.3、只有一个 in 参数的存储过程1.2.3、包含 in 参数和 out 参数的存储过程1.2.4、包含 inout 参数的存储过程1.2.5、附:根据 时间 修改 状态:...

Global site tag (gtag.js) - Google Analytics