15 存储过程

概念

存储过程:是在大型数据库系统中,一组为了完成特定功能的sql语句集,存储在数据库中,经过第一次编译后再次调用不需要重复编译,用户通过指定存储过程的名字并给出参数(如果存储过程有参数)来执行。

存储过程基本上可以完成大部分的函数可以处理的功能

与函数的异同

相同点

存储过程和函数都是为了重复地执行操作数据库sql语句的集合
存储过程和函数都是一次编译,后续执行

不同点

  • 标识符不同:函数标识符是function,存储过程是procedure

  • 函数中有返回值,而且必须返回,存储过程没有返回值

  • 存储过程没返回值,不能将结果直接赋值给变量;函数是有返回值的,调用时,除了在select中,必须将返回值赋值给变量

  • 函数可以在select语句中直接使用,存储过程不可以

创建过程

-- 创建存储过程
delimiter $$
create procedure 过程名称(参数列表)
begin
   过程体
end
$$
delimiter ;

-- 如果过程体中,只有一条指令,可以省略begin和end
create procedure 过程名称(形参)
过程体

查看过程

方式一:通过查看过程状态,查看素所有存储过程

show procedure status [like '匹配模式']

方式二:通过 过程创建语句

show create procedure 过程名;

调用过程-call

call 存储过程的名(实参列表);

删除过程

drop procedure 存储过程名;

存储过程的形参类型

存储过程的形参类型主要分为3类:

in-值传递

表示参数从外面传入到过程内部使用,可以是直接的结果数据,也可以是保存数据的变量

out-引用传递

表示参数从过程里面把数据保存到变量中,供给外部使用
如果传入的out变量本身在外部有数据,那么在进入过程后就会被清空,设置为null
out变量必须是外部定义的变量

inout-引用传递

数据可以从外部传入到过程内部使用,同时内部操作后,也可以将数据返还给外部

过程类型 变量名 数据类型

-- -------------------------- 存储过程形参
set @n1=1;
set @n2=1;
set @n3=1;

CREATE PROCEDURE my_pro(in int_1 int,out int_2 int,INOUT int_3 int)
BEGIN
  -- 查看传入的变量的值
  SELECT int_1,int_2,int_3;  -- 输出 1 null 1
  -- 当out或inout类型的变量传入后,此时并没有改变外部变量的值,而是把值传递给了形参变量
  -- 但是形参会将out类型的值清空为null

  -- 修改三个变量的值
  set int_1=10;   
  set int_2=100;   
  set int_3=1000;   
  
  -- 查看会话变量的值
  SELECT int_1,int_2,int_3;  -- 输出 10 100 100

  -- 修改会话变量的值
  set @n1='a1';
  set @n2='a2';
  set @n3='a3';

   -- 查看会话变量的值
  SELECT @n1,@n2,@n3;  -- 输出 a1 a2 a3
  -- 走到end表示过程结束:
  -- 开始工作,判断传递过来的变量是否是out类型或inout类型
  -- 如果是,将内部代替out和inout变量的对应形参的值重新赋值给外部变量(就是会覆盖外部变量本身的值)
END

-- 重置
set @n1=1;
set @n2=1;
set @n3=1;
SELECT @n1,@n2,@n3; -- 输出 1 1 1

CALL my_pro(@n1,@n2,@n3);
SELECT @n1,@n2,@n3; -- 输出a1 100 1000

posted @ 2024-07-18 17:54  songxia777  阅读(2)  评论(0编辑  收藏  举报