详解MySQL中的存储过程

0、预备知识

变量分为系统变量自定义变量,和Java一样用于存储保存数据使用的容器。

1)系统变量

该变量由系统定义的,自带的变量值,属于MySQL本身层面的。
系统变量查看

show global variables; #查看全局变量
show global variables like '%char%';# 查看满足条件的系统变量

修改系统变量值

set global 系统变量名 =;
或者 
set @global 系统变量名 =;

1.1 )全局变量

作用域:MySQL服务器启动时为所有全局变量初始化。
查看全部全局变量

#查看
SHOW GLOBAL VARIABLES; 
#查看满足条件的
SHOW GLOBAL VARIABLES LIKE '%g%';
#修改赋值全局变量 自动提交
SET @@global.autocommit=0; 
SET GLOBAL autocommit=0;

1.2)会话变量

作用域:针对于当前会话或者当前连接有效

# 查看所有会话变量
SHOW SESSION VARIABLES;
# 查看满足条件的部分会话变量
SHOW SESSION VARIABLES LIKE '%g%';
#查看指定的会话变量的值
SELECT @@autocommit;
SELECT @@session.tx_isolation;
#为某个会话变量赋值
#隔离级别更改为读未提交
方式一
SET @@session.tx_isolation='read-uncommitted';

2)自定义变量(重要)

该变量是用户自定义的,不是由系统的。和Java一样也三步走:声明、赋值、使用(查看、比较、运算)

2.1)用户变量

针对于当前会话或者当前连接有效,是在BEGIN END里面或BEGIN END外面
赋值操作符:=或:= 一般还是使用:=别分比较。
声明并初始化

set @用户变量名 :=

赋值操作

SET @变量名=;
或者
SELECT 字段 INTO @变量名
FROMwhere 条件;

使用

SET @m :=1;
SET @n :=1;
SET @sum := @m+@n;
select @sum;

2.2)局部变量

作用域:仅仅在定义它的begin end中有效。在 BEGIN END中的第一句话,主要作用于存储过程和函数中。
局部变量得声明
declare 变量名 类型;
declare 变量名 类型 [default 值]

begin
	declare a int default 1;
	declare b int default 2;
	declare sum int;
	set sum = a+b;
	select sum;
end

3、用户变量和局部变量对比

作用域使用位置语法
用户变量当前会话会话中的任何地方必须加@符号,不用限定类型
局部变量begin end 中只能用在begn end中,且为第一句话一般不加@符号,需要限定类型

主角登场存储过程

1、存储过程

1.1 概述与理解

存储过程英文:stored procedure,它的思想很简单:一组经过预先编译的SQL语句的封装类似Java的方法
存储过程预先存储在MySQL服务器上,需要执行的时候,客户端只需要发出调用的指令,服务器就会调用预先存储好的存储过程。
在这里插入图片描述
客户端只需要调用过程或者函数,MySQL服务器内部会调用一组预先编译的SQL组。

1.2 好处

1)减少操作,客户端多次向MySQL服务端发送请求过程,提高sql语句的重用性。
2)减少网络传输量(客户端不需要把所有的SQL语句通过网络发给服务器)
3)减少了SQL语句暴露在网上的风险,提高数据查询的安全性

1.3 存储过程的分类

存储过程的参数类型是可以为IN、OUT、INOUT

  • 没有参数(无参数无返回值)
  • 仅仅带IN类型(有参数无返回值)
  • 仅仅带OUT类型(无参数有返回值)
  • 既带IN又带OUT(有参数有返回值)
  • 带INOUT(有参数有返回值)
    注意:IN、OUT、INOUT都可以在存储过程中有多个。

2、创建存储过程

创建存储过程的语法:

DELIMITER $$
CREATE
    PROCEDURE 数据库名.存储过程名([in变量名 类型,out 参数 2...])
	BEGIN
		[DECLARE 变量名 类型 [DEFAULT];]
		逻辑语句
	END$$
DELIMITER ;

参数符号的说明:

关键字作用
IN当前参数为输入参数,表示入参 ,存储过程只是读取这个参数的值没有定义参数类型,默认是IN
OUT当前参数为输出参数,出参,执行完成之后,调用该存储过程返回该参数的值
INOUT当前参数既可以为输入参数,也可以是输出参数

存储过程的语句是在begin和end之间编写,声明变量是declare,默认值default,在begin…end 中修改变量值,使用set 变量 = 值
存储过程中的每一条SQL语句的结尾要求必须加分号,存储过程的结尾可以使用 delimiter 重新设置
delimiter 结束标记

3、不同存储过程案例

3.1)空参存储过程

定义一个存储过程:

delimiter $$
create procedure girls.demo()
begin
    declare user_name varchar(20);
    set user_name = '李四';
    select user_name;
end $$
delimiter ;

调用存储过程:

call demo();

在这里插入图片描述

3.2)带IN模式的存储过程

定义一个存储过程:

delimiter $$
create procedure girls.demo2(IN user_name varchar(20))
begin
    select * from employees where name = user_name;
end $$
delimiter ;

call demo2('李四');

在dataGrip上显示数据不代表它有返回值。

3.3)带OUT模式的存储过程

定义一个存储过程:

delimiter $$
create procedure girls.demo3(IN user_name varchar(20), IN emp_number varchar(20), OUT salary1 float)
begin
    select salary into salary1 from employees where name = user_name and emp_no = emp_number;
end $$
delimiter ;
call demo3('李四','10001',@salary1);
select @salary1;

4、删除存储过程

语法格式如下:

DROP PROCEDURE [ IF EXISTS ] <过程名>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值