三十一、mysql的存储过程

1、存储过程的创建

存储过程的定义: 存储过程简称过程,procedure,是一种用来处理数据的方式,存储过程可以被理解为是一种没有返回值的函数。
创建存储过程的基本语法:

   delimiter $$
   create procedure 过程名字(参数列表)
    begin
      过程体; //如果过程之中需要显示数据,用select即可
    end
   $$
   delimiter ;

实例:

   //创建存储过程,显示'Hello World!'
   delimiter $$
   create procedure Hello()
    begin
     select 'Hello World!';
    end
    $$
   delimiter ;  

运行结果:
在这里插入图片描述

2、查看存储过程

查看存储过程的基本语法: show procedure status [like ‘pattern’];
查看过程创建语句: show create procedure 过程名;
实例: 查看1的实例中存储过程及其创建语句

//存储过程的查看
show procedure status like 'Hello' \G //\G的意思是将结果进行旋转,show类型的语句都可以用
//查看存储过程创建语句
show create procedure Hello;

注: 在加上\G的时候,结尾不能加;,否则会报No query specified错误
解析: 针对带“\G”和不带“\G”的区别
1、不带“\G”
在这里插入图片描述
2、带“\G”
在这里插入图片描述

3、存储过程调用方法

存储过程没有返回值,所以不能通过select进行访问,而需要通过call关键字进行调用;具体的调用方法是:call 过程名(参数列表);
实例: 调用1中实例的存储过程
call Hello();

4、存储过程的删除&修改

同函数一样,存储过程不能直接修改,只能删除掉旧的存储过程,然后创建新的存储过程才可以。
删除存储过程的基本语法: drop procedure 过程名;
实例: 删除1中的存储过程
drop procedure Hello;

5、存储过程的参数类型

函数的参数需要数据类型指定,过程比函数更严谨,过程还有自己的类型限定,主要分为三类:

  1. in: 数据只能从外部传入内部使用(是值传递),类型可以是数据或者变量;且在存储过程中修改该参数的值不能被返回(即该类型的值在存储过程中使用时,使用的是其副本,故此,当存储过程对其作出改变,当存储过程结束时,查看该值,该值保持不变,因为存储过程用的仅仅是他的副本);仅需要将数据传入存储过程,并不需要返回计算后的该值,使用此类型;这个类型是默认的。
  2. out:只允许过程内部使用(不用外部数据),即该类型不允许外部的值进入到存储过程,如果将外部的变量传入的话,那么该变量的值会被清空,然后才进入到存储过程;该类型的值可以返回,调用时该类型只能传入变量。
  3. inout:需要在调用时指定具体的值,并且该类型的值可以被返回(存储过程内部对其的更改也是生效的);即in和out,包括了in和out的功能;这是一种典型的引用传递,只能传变量。

基本语法: create procedure 过程名字(参数类型 形参名字 数据类型)
其中,参数类型指:in、out、inout
实例1: 创建存储过程,分别设置三个值,观察三种类型的不同

  delimiter $$
  create procedure Parameter_check(in i_num1 int, out o_num2 int, inout i_o_num3 int)
   begin
    select i_num1,o_num2,i_o_num3; //o_num2的值一定是null,由其类型易知,其在进入到存储过程中时,一定会被清空。
   end
   $$
  delimiter ;

定义全局变量:num1=123 num2=456 num3=789;然后再调用上述存储过程
说明: 调用:out和inout类型的参数必须传入变量,而不能是数据。
注: 存储过程对于变量的操作(返回)是滞后的,是在存储过程调用结束的时候,才会重新将内部修改的值赋值给外部传入的对应的全局变量。最后,在存储过程调用结束之后,系统会将局部变量重新的值返回给对应的全局变量(out和inout类型的,因为in类型的数据不允许出存储过程),并且除了in之外,其他类型的变量均可以在调用存储过程时再创建,不过此时就不能初始化了,比如call my_procedure(@num1)
实例2: 创建存储过程,证明“注”部分内容

  delimiter $$
  create procedure my(in i_num1 int, out o_num2 int, inout i_o_num3 int)
   begin
     set i_num1 = 121;
     set o_num2 = 58;
     set i_o_num3 = 888;
     select i_num1,o_num2,i_o_num3;
   end
   $$
 delimiter ;

用实例1中定义的全局变量来访问本实例的存储过程

//定义变量
set @num1=123,@num2=456,@num3=789;
//刚开始实例1并未有改变全局变量的操作,所以刚开始全局变量的值应为num1=123 num2=456 num3=789
//调用存储过程之后
call my(@num1,@num2,@num3);
运行结果:num1 = 121  num2 = 58 num3 = 888
//查看全局变量的值
select @num1,@num2,@num3;
运行结果:num1 = 123  num2 = 58 num3 = 888

从以上运行结果看出,num1的值在查看全局变量时并未改变,也印证了前面的说法,只将存储过程内部的数据返回给out和inout类型的对应的变量。

附:

mysql的存储过程在传入中文或者将中文插入数据库时出现编码错误,解决的办法有:

  1. 由客户端或其他地方编码引起,将编码统一即可
  2. 由参数的数据类型错误引起,需要注意,在mysql的存储过程中,如果参数接受的是中文内容,则需要将varchar类型改为nvarchar类型。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值