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、存储过程的参数类型
函数的参数需要数据类型指定,过程比函数更严谨,过程还有自己的类型限定,主要分为三类:
- in: 数据只能从外部传入内部使用(是值传递),类型可以是数据或者变量;且在存储过程中修改该参数的值不能被返回(即该类型的值在存储过程中使用时,使用的是其副本,故此,当存储过程对其作出改变,当存储过程结束时,查看该值,该值保持不变,因为存储过程用的仅仅是他的副本);仅需要将数据传入存储过程,并不需要返回计算后的该值,使用此类型;这个类型是默认的。
- out:只允许过程内部使用(不用外部数据),即该类型不允许外部的值进入到存储过程,如果将外部的变量传入的话,那么该变量的值会被清空,然后才进入到存储过程;该类型的值可以返回,调用时该类型只能传入变量。
- 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的存储过程在传入中文或者将中文插入数据库时出现编码错误,解决的办法有:
- 由客户端或其他地方编码引起,将编码统一即可
- 由参数的数据类型错误引起,需要注意,在mysql的存储过程中,如果参数接受的是中文内容,则需要将varchar类型改为nvarchar类型。