MySQL的存储过程(in、out、inout)

   日期:2020-11-06     浏览:78    评论:0    
核心提示:一、简介从 5.0 版本才开始支持,是一组为了完成特定功能的SQL语句集合(封装),比传统SQL速度更快、执行效率更高。存储过程的优点1、执行一次后,会将生成的二进制代码驻留缓冲区(便于下次执行),提高执行效率2、SQL语句加上控制语句的集合,灵活性高3、在服务器端存储,客户端调用时,降低网络负载4、可多次重复被调用,可随时修改,不影响客户端调用5、 可完成所有的数据库操作,也可控制数据库的信息访问权限为什么要用存储过程?1.减轻网络负载;2.增加安全性二、创建存储过程使用crea

一、简介

  • 从 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参数赋值类型必须为变量。
 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服