必威体育Betway必威体育官网
当前位置:首页 > IT技术

MySQL | 存储过程

时间:2019-09-10 12:12:11来源:IT技术作者:seo实验室小编阅读:71次「手机版」
 

mysql 存储过程

一、概念

存储过程简称过程,procedure,是一种用来处理数据(增删改)的方式。简单点,我们也可以将其理解为没有返回值的函数

一般存储过程并不显示结果,而是把结果返回给你指定的变量

二、创建过程

基本语法

create procedure 过程名字([参数列表])
begin
    -- 过程体
end

如果过程体中只有一条指令,则可以省略 begin 和 end

创建一个完整的存储过程

三、查看过程

查看全部存储过程:show procedure status [like 'pattern'];

查看存储过程的创建语句:show create procedure 过程名字

四、调用过程

  • 语法:call 过程名([实参列表])

因为存储过程实际上是一种函数,所以存储过程名后需要有()符号,即使没有参数也需要()

五、删除过程

语法:drop procedure 过程名

六、存储过程的形参类型

函数的参数需要指定数据类型,过程比函数更加严格。过程有三种自己的参数类型

  • in:参数从外部传入到内部,可以是数据或者变量
  • out:参数从过程里面把数据保存到变量,然后交给外部使用,从外部传入的必须是变量。如果从外部传入的变量本身有值,需要先清空在传入内部
  • inout此参数只能传递变量,该变量的值可以给过程内部使用,过程结束后可以变量的值传递给过程外部使用
基本语法

procedure 过程名(in 参数名字 参数类型, out 参数名字 参数类型, inout 参数名字 参数类型)

我们先定义一个简单的过程

delimiter ##
create procedure pro(in var1 int, out var2 int, inout var3 int)
begin
   -- 查看该过程传入的三个变量
   select var1, var2, var3;
end
##

delimiter ;

-- 调用过程
call pro(1, 2, 3);

在调用该函数的时候出现错误,因为 in 和 out 类型只能接受变量,不能接受具体的数值

因此,我们先定义几个变量,然后再调用

可以看到,传递给 out 类型参数的 @var2 变量在经过过程处理之后,变为了 null,这是因为在 out 修饰的参数中,如果传入的变量有值,也会自动清空为 null。同时在过程内部对变量的值的改变会影响到外部

1.

先来看一个例子

set @no1 = 100;
set @no2 = 200;
set @no3 = 300;

delimiter ##
create procedure pro(in var1 int, out var2 int, inout var3 int)
begin
    -- 查看传入的三个变量的值
    select var1, var2, var3;
    
    -- 修改三个变量的值
    set var1 = 1;
    set var2 = 2;
    set var3 = 3;
    
    -- 修改后的三个变量的值
    select var1, var2, var3;
    
    -- 查看会话变量
    select @no1, @no2, @no3;

end
##

delimiter ;

-- 调用改方法
call pro(@no1, @no2, @no3);

如图所示,我们成功创建了该过程

然后我们调用该方法,参数就是之前定义的变量,结果如下。可以看到 in 类型参数在内部改变后,在外部查询还是改变之前的值,out 和 inout 类型参数在内部改变后,外部查询就是改变之后的值。

2.

我们在来看一个例子

set @no1 = 100;
set @no2 = 200;
set @no3 = 300;

delimiter ##
create procedure pro2(in var1 int, out var2 int, inout var3 int)
begin
    -- 查看三个传入进来的数据的值
    select var1, var2, var3;
    
    -- 修改三个变量的值
    set var1 = 1;
    set var2 = 2;
    set var3 = 3;
    
    -- 查看修改后的三个变量的值
    select var1, var2, var3;
    
    -- 查看会话变量
    select @no1, @no2, @no3;
    
    -- 修改会话变量
    set @no1 = 'a';
    set @no2 = 'b';
    set @no3 = 'c';
    
    -- 查看修改会话变量之后的值
    select @no1, @no2, @no3;

end;
##
delimiter ;

-- 调用过程
call pro2(@no1, @no2, @no3);

我们不仅在内部对传入的参数作了修改,还直接对会话变量作了修改。对应 in 类型参数,只有直接对会话变量进行修改,外部才真查询到修改;out 和 inout 参数若已经通过传入的参数进行修改了,外部查询到的就是对参数修改后的值,就算在内部使用会话变量修改也没有用

总结
  • in 类型修饰的变量类似于“值传递”,即传入的只是变量的拷贝,就算在过程里面修改了,那也只是对拷贝的变量进行修改,原来的变量的值依然没有修改
  • out 和 inout 类型修饰的变量也同样是 “值传递”,和 in 不同是的,他们是通过引用来传递的,即先拷贝一个引用,指向传入的变量,对变量进行修改。此时变量的修改就会覆盖原来的值

七、过程和函数

相同点
  • 存储过程和函数都是为了可重复执行操作数据库sql 语句的集合
  • 存储过程和函数都是一次编译,后续执行
不同点
  • 标识符不同,函数是 function,过程是 procedure
  • 函数中有返回值,过程没有返回值
  • 函数中不能使用 select 语句,而过程可以使用
  • 函数最后可以通过 select 语句使用,过程通过 call 语句使用

相关阅读

navicat for mysql 注册码,简简单单,一个搞定

打开navicat for mysql接着打开帮助,选中注册, 把下面的复制上去就可以了 NAVH-WK6A-DMVK-DKW3  

善用mysql中的FROM_UNIXTIME()函数和UNIX_TIMESTAMP()

我们经常会面临要从数据库里判断时间,取出特定日期的查询。但是数据库里储存的都是unix时间戳,处理起来并不是特别友好。幸而MYSQL

MySQL免安装版,遇到MSVCR120.dll文件丢失错误的解决方

在进行mysql zip版本的安装时,遇到上图的错误,在网上找了相关的文件拷贝到相应目录下,但还是不行。 后来终于找到解决方法:下载 VC re

Navicat连接mysql报错2509

在Navicat中进行连接测试时,发现报错2509,还有乱码!mysql 2509 加密方式导致的报错,在8以后的版本默认的加密方式都改为了caching_sha

MySql创建存储过程(procedure)

如果存储过程中含有动态SQL语句,在触发器中调用该存储过程时会报错ERROR 1336 (0A000): Dynamic SQL is not allowed in stored fu

分享到:

栏目导航

推荐阅读

热门阅读