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

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数据存储过程参数实例详解的全部内容,希望对大家了解MySQL有所帮助。感兴趣的朋友可以继续参阅本站:解析MySQL中存储时间日期类型的选择问题、MySQL 声明变量及存储过程分析等,有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对本站的支持!

时间: 2017-10-17

MySQL内存及虚拟内存优化设置参数

mysql 优化调试命令   1.mysqld --verbose --help 这个命令生成所有mysqld选项和可配置变量的列表 2.通过连接它并执行这个命令,可以看到实际上使用的变量的值: mysql> SHOW VARIABLES; 还可以通过下面的语句看到运行服务器的统计和状态指标: mysql>SHOW STATUS: 使用mysqladmin还可以获得系统变量和状态信息: shell> mysqladmin variables shell> mysqladmin ex

MySQL性能参数详解之Max_connect_errors 使用介绍

max_connect_errors是一个MySQL中与安全有关的计数器值,它负责阻止过多尝试失败的客户端以防止暴力破解密码的情况.max_connect_errors的值与性能并无太大关系. 默认情况下,my.cnf文件中可能没有此行,如果需要设置此数值,手动添加即可. 参数格式 max_connect_errors = 10 修改方法 如果系统是CentOS.Debian等,则配置文件可能位于 /etc/my.cnf .打开此文件 [root@www ~]# vi /etc/my.cnf 然

MySQL修改tmpdir参数

今天突然收到报警短信,说是/磁盘空间使用超过阀值.经查看,发现是有很多异常的SQL,执行不了,导致一直在处理,产生了临时占用了/tmp磁盘空间. 由于操作系统的/tmp空间有限,需要进行参数修改,将tmpdir的值路径进行修改. mysql> show variables like 'tmpdir'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | tmpdir | /tmp | +-

MySQL性能参数详解之Skip-External-Locking参数介绍

MySQL的配置文件my.cnf中默认存在一行skip-external-locking的参数,即"跳过外部锁定".根据MySQL开发网站的官方解释,External-locking用于多进程条件下为MyISAM数据表进行锁定. 如果你有多台服务器使用同一个数据库目录(不建议),那么每台服务器都必须开启external locking:   参数解释 当外部锁定(external-locking)起作用时,每个进程若要访问数据表,则必须等待之前的进程完成操作并解除锁定.由于服务器访问数

my.ini优化mysql数据库性能的十个参数(推荐)

今天刚好需要配置mysql 5.5.45,因为数据库量挺大的,所以必须优化,要不mysql真的不快. (1).max_connections: 允许的同时客户的数量.增加该值增加 mysqld 要求的文件描述符的数量.这个数字应该增加,否则,你将经常看到 too many connections 错误. 默认数值是100,我把它改为1024 . (2).record_buffer: 每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区.如果你做很多顺序扫描,你可能想要增加该值.默认

Mysql数据库性能优化一

今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库. mysql的性能优化无法一蹴而就,必须一步一步慢慢来,从各个方面进行优化,最终性能就会有大的提升. Mysql数据库的优化技术 对mysql优化是

Mysql数据库性能优化三(分表、增量备份、还原)

接上篇Mysql数据库性能优化二 对表进行水平划分     如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了.如果我拆成100个表,那么每个表只有10万条记录.当然这需要数据在逻辑上可以划分.一个好的划分依据,有利于程序的简单实现,也可以充分利用水平分表的优势.比如系统界面上只提供按月查询的功能,那么把表按月拆分成12个,每个查询只查询一个表就够了.如果非要按照地域来分,即使把表拆的再小,查询还是要联合所有表来查,还不如不拆了.所以一个好的拆分依据是 最重要的

Mysql数据库性能优化之子查询

记得在做项目的时候, 听到过一句话, 尽量不要使用子查询, 那么这一篇就来看一下, 这句话是否是正确的. 那在这之前, 需要介绍一些概念性东西和mysql对语句的大致处理. 当Mysql Server的连接线程接收到Client发送过来的SQL请求后, 会经过一系列的分解Parse, 进行相应的分析, 然后Mysql会通过查询优化器模块, 根据该Sql所涉及到的数据表的相关统计信息进行计算分析. 然后在得出一个Mysql自认为最合理最优化的数据访问方式, 也就是我们常说的"执行计划",

MySQL数据库性能优化介绍

目录 为什么做优化?? 从哪些方面入手?? 解决方案是什么???  要怎样选择??? SQL优化 总结 为什么做优化?? 因为数据量太多了,项目部署上线再到用户使用,每天数据增长几十万条,给服务器带来非常大的负担,互联网一直追求高性能,可是随着业务规模变大,用户数量变多,服务器的性能越来越差,因此我们不得不对数据库有更高要求. 从哪些方面入手?? 第一,是查询的速度,我们期望数据量到达TB级别仍然能够实现百万级别查询速度. 第二.是并发量,我们对它的要求能够同时处理几千甚至上万的并发访问,还要配

Mysql数据库性能优化二

在上篇文章给大家介绍了mysql数据库性能优化一,今天继续接着上篇文章给大家介绍数据库性能优化相关知识.具体内容如下所示: 建立适当的索引 说起提高数据库性能,索引是最物美价廉的东西了.不用加内存,不用改程序,不用调sql,只要执行个正确的'create index',查询速度就可能提高百倍千倍,这可真有诱惑力.可是天下没有免费的午餐,查询速度的提高是以插入.更新.删除的速度为代价的,这些写操作,增加了大量的I/O. 是不是建立一个索引就能解决所有的问题?ename上没有建立索引会怎样? sel

解析MySQL数据库性能优化的六大技巧

数据库表表面上存在索引和防错机制,然而一个简单的查询就会耗费很长时间.Web应用程序或许在开发环境中运行良好,但在产品环境中表现同样糟糕.如果你是个数据库管理员,你很有可能已经在某个阶段遇到上述情况.因此,本文将介绍对MySQL进行性能优化的技巧和窍门. 1.存储引擎的选择如果数据表需要事务处理,应该考虑使用InnoDB,因为它完全符合ACID特性.如果不需要事务处理,使用默认存储引擎MyISAM是比较明智的.并且不要尝试同时使用这两个存储引擎.思考一下:在一个事务处理中,一些数据表使用Inno

优化mysql数据库的经验总结

1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小.例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间,甚至使用VARCHAR这种类型也是多余的,因为CHAR(6)就可以很好的完成任务了.同样的,如果可以的话,我们应该使用MEDIUMINT而不是BIGIN来定义整型字段.另外一个提高效率的方法是在

优化MySQL数据库中的查询语句详解

很多时候基于php+MySQL建立的网站所出现的系统性能瓶颈往往是出在MySQL上,而MySQL中用的最多的语句就是查询语句,因此,针对MySQL数据库查询语句的优化就显得至关重要!本文就此问题做出详细分析如下: 1.判断是否向MySQL数据库请求了不需要的数据,如下列情况: (1).查询不需要的数据,例如你需要10条数据,但是你选出了100条数据加了limit做限制. (2).多表关联时返回全部列 (3).总是取出全部列select*......取出全部列,会让优化器无法完成索引覆盖扫描这类优

mysql 数据库链接状态确认实验(推荐)

目录 1.起因: 2.实验 2.1 确认数据链接状态,使用完的数据链接是什么状态呢? 2.2 数据库在执行的时候,是不是有一个执行中的状态呢? 2.3 测试3:添加对象的状态,控制链接是否可用 1.起因: 在做一个小系统的时候,我想数据量交互不大,就都用一个链接执行算了,还能节省点资源,但是实际情况遇到了如下问题,在使用的过程中,有些数据操作会被转移到其他线程,这样:我这个简单的想法遇到了问题,因为一个现场在使用这个链接的时候,其他线程也会同步插入执行数据操作,这样一个链接就会面临共用的冲突,怎