在线练习mysql的网址
存储过程
存储过程简称过程,procedure ,是一种用来处理数据的方式;
存储过程也可以理解为:一种没有返回值的函数;
创建过程
create procedure 过程名字([参数列表])
begin
-- 过程体
end
查看过程
函数的查看方式完全适用于过程:关键字换成procedure
查看所有过程: show procedure status like 'pre%' \G
其中\G 和;一个意思不过\G 查看的样式好看;
查看过程创建语句
show create procedure 过程名 \G
调用过程查询
过程没有返回值:select是不能访问的
过程有一个专门的调用关键字:call
修改过程 和 删除过程
过程只能先删除 ,后新增
drop procedure 过程名;
存储过程的过程参数
函数的参数需要数据类型指定,过程比函数更严格
过程还有自己的类型限定:三种类型
In :数据只是从外部传入给内部使用,可以是数值也可以是变量;
out : 只允许过程内部使用,给外部使用的, 外部数据会被先清空才会进入到内部,只能是变量;
inout : 外部可以在内部使用,内部修改也可以给外部使用,典型的引用类型,只能传变量
基本使用:
create procedure 过程名(in 形参名字 数据类型 , out 形参名字 数据类型, inout 形参名字 数据类型 )
-- 过程参数
delimite $$ -- 声明语句结束符,可以自定义:
create procedure pree(in int_1 int, out int_2 int, intout int_3 int)
begin
-- 先查看三个变量
select int_1,int_2,int_3;
end
$$
delimiter ; -- 将语句的结束符号恢复为分号
调用 :out 和 inout 类型的参数必须传入变量 ,而不能是数值
mysql定义变量的讲解
MySQL存储过程中,定义变量有两种方式:
1使用set或select直接赋值,变量名以@开头
set @var=1;
2 以declare关键字声明的变量,只能在存储过程中使用,称为存储过程变量,例如:
declare var1 int default 0;
两者的区别是:
在调用存储过程时,以declare声明的变量都会被初始化为null。而会话变量(即@开头的变量)则不会被再初始化,在一个会话内,只须初始化一次,之后在会话内都是对上一次计算的结果,就相当于在是这个会话内的全局变量
可以理解为 set @var=1; 定义的为全局变量;
正确的调用;
set @int_1 = 1;
set @int_2 = 2;
set @int_3 = 3;
先定义 @int_1,@int_2,@int_3,
然后在调用 call pree2() 存储过程
然后在查看 @int_1,@int_2,@int_3,
存储过程对于变量的操作(返回)是滞后的:是在存储过程调用的结束的时候,才会重新将内部修改的值赋值给外部
传入的全局变量;
delimiter $$
create procedure pree3(in int_1 int, out int_2 int, inout int_3 int)
begin
-- 先查看三个变量
select int_1,int_2,int_3; -- 当前三个变量为局部变量
-- 修改局部变量
set int_1 = 10;
set int_2 = 100;
set int_3 = 1000;
-- 查看局部变量
select int_1,int_2,int_3;
-- 查看全局变量
select @int_1,@int_2,@int_3;
-- 修改全局变量
set @int_1 = 'a';
set @int_2 = 'b';
set @int_3 = 'c';
-- 查看全局变量
select @int_1,@int_2,@int_3;
end
$$
delimiter ;
测试 :传入数据 1,2,3;说明局部变量与全局变量无关
最后:在存储过程调用结束之后,系统会将局部变量重复返回给全局变量
在存储过程调用结束之后:out 类型 和 inout 类型会将过程内部对应的局部变量值重新返回给对应
的全局变量 这样反向 解决了存储过程没有返回值的问题,这样可以是内部的结果返回给外部使用;