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

 更新时间:2020年11月06日 10:50:22   作者:zzzf98  
这篇文章主要给大家介绍了关于MySQL存储过程(in、out、inout)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、简介

从 5.0 版本才开始支持,是一组为了完成特定功能的SQL语句集合(封装),比传统SQL速度更快、执行效率更高。

存储过程的优点

1、执行一次后,会将生成的二进制代码驻留缓冲区(便于下次执行),提高执行效率

2、SQL语句加上控制语句的集合,灵活性高

3、在服务器端存储,客户端调用时,降低网络负载

4、可多次重复被调用,可随时修改,不影响客户端调用

5、 可完成所有的数据库操作,也可控制数据库的信息访问权限

为什么要用存储过程?

1.减轻网络负载;2.增加安全性

二、创建存储过程

2.1 创建基本过程

使用create procedure语句创建存储过程

存储过程的主体部分,被称为过程体;以begin开始,以end$$结束

#声明语句结束符,可以自定义:
delimiter $$
#声明存储过程
create procedure 存储过程名(in 参数名 参数类型)
begin
#定义变量
declare 变量名 变量类型
#变量赋值
set 变量名 = 值
 sql 语句1;
 sql 语句2;
 ...
end$$
#恢复为原来的语句结束符
delimiter ;(有空格)

实例:

mysql> delimiter $$
mysql> create procedure text()
 -> begin
 -> select * from stu.a_player;
 -> end $$
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;

调用存储过程

call 存储过程名(实际参数);
mysql> call text;
+----+----------+-------+
| id | name  | score |
+----+----------+-------+
| 1 | zhangsan | 88 |
| 2 | lisi  | 89 |
| 3 | wangwu | 67 |
| 4 | zhaoliu | 90 |
| 5 | xuli  | 80 |
| 6 | keke  | 75 |
+----+----------+-------+
6 rows in set (0.00 sec)

删除存储过程

mysql> drop procedure text;

2.2 存储过程的参数

MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT,形式如:

CREATEPROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类形...])

IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)

OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)

INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)

传递参数实例:

IN

mysql> create procedure test1(in in_id int(2))
 -> begin
 -> select * from stu.a_player where id=in_id;
 -> end $$
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;

#将4传递给in_id变量,执行事务
mysql> call test1(4); 
+----+---------+-------+
| id | name | score |
+----+---------+-------+
| 4 | zhaoliu | 90 |
+----+---------+-------+
1 row in set (0.00 sec)

#将6传递给in_id变量,执行事务
mysql> call test1(6);
+----+------+-------+
| id | name | score |
+----+------+-------+
| 6 | keke | 75 |
+----+------+-------+
1 row in set (0.00 sec)

OUT

mysql> delimiter $$
mysql> create procedure test2(out aa int) 
 -> begin
 -> select aa;
 -> set aa=2;
 -> select aa;
 -> end $$
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
#将@aa变量传递给test2 事务
mysql> call test2(@aa);
+------+
| aa |
+------+
| NULL |
+------+
#out向调用者输出参数,不接收输入的参数,所以aa为null
1 row in set (0.00 sec)
+------+
| aa |
+------+
| 2 |
+------+
事务将aa变量设置为2(设置的是全局),则可进行输出
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> select @aa;
+------+
| @aa |
+------+
| 2 |
+------+
1 row in set (0.00 sec)
#事务外查询变量,已经被修改

IN 、OUT、 INOUT 对比

mysql> delimiter //
mysql> create procedure test3(in num1 int,out num2 int,inout num3 int)
 -> begin
 -> select num1,num2,num3;
 -> set num1=10,num2=20,num3=30;
 -> select num1,num2,num3;
 -> end //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> call test3(@num1,@num2,@num3);
+------+------+------+
| num1 | num2 | num3 |
+------+------+------+
| 1 | NULL | 3 |
+------+------+------+
1 row in set (0.00 sec)
+------+------+------+
| num1 | num2 | num3 |
+------+------+------+
| 10 | 20 | 30 |
+------+------+------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)

in和inout参数会将全局变量的值传入存储过程中,而out参数不会将全局变量的值传入存储过程中。在存储过程使用中,参数值in,out,inout都会发生改变。

mysql> select @num1,@num2,@num3;
+-------+-------+-------+
| @num1 | @num2 | @num3 |
+-------+-------+-------+
|  1 | 20 | 30 |
+-------+-------+-------+
1 row in set (0.00 sec)

调用完存储过程后,发现in参数不会对全局变量的值引起变化,而out和inout参数调用完存储过程后,会对全局变量的值产生变化,会将存储过程引用后的值赋值给全局变量。

in参数赋值类型可以是变量还有定值,而out和inout参数赋值类型必须为变量。

总结

到此这篇关于MySQL存储过程(in、out、inout)的文章就介绍到这了,更多相关MySQL存储过程(in、out、inout)内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL中隔离级别RC与RR的区别及说明

    MySQL中隔离级别RC与RR的区别及说明

    这篇文章主要介绍了MySQL中隔离级别RC与RR的区别及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • mysql数据库隔离级别详解

    mysql数据库隔离级别详解

    SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的,下面这篇文章主要给大家介绍了关于mysql数据库隔离级别的相关资料,需要的朋友可以参考下
    2022-06-06
  • mysql 8.0.18 压缩包安装及忘记密码重置所遇到的坑

    mysql 8.0.18 压缩包安装及忘记密码重置所遇到的坑

    这篇文章主要介绍了mysql 8.0.18 压缩包安装及忘记密码重置所遇到的坑,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • 安装MySQL phpMyAdmin cpolar实现远程访问连接的操作步骤

    安装MySQL phpMyAdmin cpolar实现远程访问连接的操作步骤

    这篇文章主要给大家介绍了安装 MySQL phpMyAdmin cpolar实现远程访问连接的流程步骤,文中有详细的图文介绍,具有一定的参考价值,需要的朋友可以参考下
    2023-08-08
  • mysql启动错误之mysql启动报1067错误解决方法

    mysql启动错误之mysql启动报1067错误解决方法

    MYSQL启动报1067错误,系统日志中是“服务 mysql 意外停止” Mysql日志中则是:Plugin 'FEDERATED' is disabled,下面给出解决方法
    2014-02-02
  • MYSQL慢查询和日志实例讲解

    MYSQL慢查询和日志实例讲解

    这篇文章主要介绍了MYSQL慢查询和日志实例讲解,有对这方面感兴趣的同学可以研究学习下
    2021-02-02
  • win10下mysql5.7.21解压版安装教程

    win10下mysql5.7.21解压版安装教程

    这篇文章主要为大家详细介绍了win10下mysql5.7.21解压版安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • 如何修改WAMP中mysql默认空密码的方法

    如何修改WAMP中mysql默认空密码的方法

    WAMP安装好后,mysql密码是为空的,那么要如何修改呢?其实很简单,通过几条指令就行了,下面我就一步步来操作。
    2011-07-07
  • Mysql快速插入千万条数据的实战教程

    Mysql快速插入千万条数据的实战教程

    这篇文章主要给大家介绍了关于Mysql快速插入千万条数据的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Oracle与MySQL的区别及优缺点

    Oracle与MySQL的区别及优缺点

    这篇文章主要介绍了Oracle与MySQL的区别及优缺点,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参加一下
    2022-08-08

最新评论