mysql的存储过程

标签: mysql存储过程  存储过程的创建  存储过程的查看  存储过程的参数

在线练习mysql的网址

在线的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 类型会将过程内部对应的局部变量值重新返回给对应

的全局变量   这样反向 解决了存储过程没有返回值的问题,这样可以是内部的结果返回给外部使用;

原文链接:加载失败,请重新获取