MySQL高级第二章——存储过程

学习目标:

学会使用存储过程


学习内容:

  1. 创建与调用过程
  2. 学会使用变量
  3. 流程控制语句
  4. 流程控制语句

学习时间:

2021/3/11


存储过程的优缺点

优点:

  1. 通过把处理封装在容易使用的单元中,简化复杂的操作;

  2. 简化对变动的管理。如果表名、列名或业务逻辑有变化。只需要更改存储过程的代码,使用它的人员不 会改自己的代码;

  3. 通常存储过程有助于提高应用程序的性能。当创建的存储过程被编译之后,就存储在数据库中。 但是, MySQL
    实现的存储过程略有不同。MySQL 存储过程按需编译。在编译存储过程之后,MySQL 将其放入 缓存中。MySQL
    为每个连接维护自己的存储过程高速缓存。如果应用程序在单个连接中多次使用存储 过程,则使用编译版本,否则存储过程的工作方式类似于查询;

  4. 存储过程有助于减少应用程序和数据库服务器之间的流量,因为应用程序不必发送多个冗长的 SQL 语
    句,而只用发送存储过程的名称和参数;

  5. 存储的程序对任何应用程序都是可重用的和透明的。存储过程将数据库接口暴露给所有应用程序,以便
    开发人员不必开发存储过程中已支持的功能;

  6. 存储的程序是安全的。数据库管理员可以向访问数据库中存储过程的应用程序授予适当的权限,而不向 基础数据库表提供任何权限。

缺点:

  1. 如果使用大量存储过程,那么使用这些存储过程的每个连接的内存使用量将会大大增加。 此外,如果
    您在存储过程中过度使用大量逻辑操作,则 CPU 使用率也会增加,因为 MySQL 数据库最初的设计侧重
    于高效的查询,不利于逻辑运算;
  2. 存储过程的构造使得开发具有复杂业务逻辑的存储过程变得更加困难;
  3. 很难调试存储过程。只有少数数据库管理系统允许您调试存储过程。不幸的是,MySQL 不提供调试存
    储过程的功能;
  4. 开发和维护存储过程并不容易。开发和维护存储过程通常需要一个不是所有应用程序开发人员拥有的专
    业技能。这可能会导致应用程序开发和维护阶段的问题。

存储过程语法解析

  1. create procedure 用来创建过程;
  2. mypro 用来定义过程名称;
  3. (in a int,in b int,out sum int)表示过程的参数,其中 in 表示输入参数,out 表示输出参数。类似于 Java 定义方法时的形参和返回值;
  4. begin 与 end 表示过程主体的开始和结束,相当于 Java 定义方法的一对大括号;
  5. call 用来调用过程,@s 是用来接收过程输出参数的变量。

存储过程的参数

  1. create procedure 用来创建过程;
  2. mypro 用来定义过程名称;
  3. (in a int,in b int,out sum int)表示过程的参数,其中 in 表示输入参数,out 表示输出参数。类似于 Java 定义方法时的形参和返回值;
  4. begin 与 end 表示过程主体的开始和结束,相当于 Java 定义方法的一对大括号;
  5. call 用来调用过程,@s 是用来接收过程输出参数的变量

存储过程的参数

  1. IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量);
  2. OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量);
  3. INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)。

创建与调用过程

-- 创建存储过程
create procedure mypro(in a int,in b int,out sum int)
begin
set sum = a+b;
end;

MySQL高级第二章——存储过程_第1张图片创建成功后的截图
如果不确定自己是否创建成功可以使用视图工具Navicat中查看,如图:

MySQL高级第二章——存储过程_第2张图片
调用过程
在这里插入图片描述

结果
在这里插入图片描述


变量

MySQL 中的存储过程类似 java 中的方法。既然如此,在存储过程中也同样可以使用变量。java 中的局部
变量作用域是变量所在的方法,而 MySQL 中的局部变量作用域是所在的存储过程。

1、变量定义

DECLARE variable_name [,variable_name...] datatype 

declare 用于声明变量;

variable_name 表示变量名称;

datatype 为 MySQL 的数据类型;

default 用于声明默认值;

例如:declare name varchar(20)

2、变量赋值

SET 变量名 = 表达式值 [,variable_name  = expression ...]

实例:

声明一个变量username,给username赋值,根据名字进行查询

create procedure mypro1()
begin
	declare username1 varchar(16);
	set username1='张';
	select * from mytable where username=username1;
end; 
-- 调用过程
call mypro1();

运行结果:
在这里插入图片描述

mytableb表:

CREATE TABLE `mytable`  (
  `ID` int(11) NOT NULL,
  `username` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  INDEX `myindex`(`username`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
INSERT INTO `mytable` VALUES (1, '张三');
INSERT INTO `mytable` VALUES (2, '李四');
INSERT INTO `mytable` VALUES (3, '勾三');
INSERT INTO `mytable` VALUES (4, '股四');
INSERT INTO `mytable` VALUES (5, '张');

流程控制语句

1、if 条件语句

IF 语句包含多个条件判断,根据结果为 TRUE、FALSE 执行语句,与编程语言中的 if、else if、else 语法类似。

案例:

1、输入一个数,判断这个数是整数还是负数

create procedure mypro2(in num int)
begin
	if num<0 then
		select '负数';
	elseif num=0 then
		select '既不是负数也不是正数';
	else
		select '正数';
		end if;
end;
-- 调用过程
call mypro2(0);

运行结果:
在这里插入图片描述
2、输入一个数,判断能不能被三整除

create procedure mypro3(in num int)
begin
	if num%3=0 then
		select '可以被三整除';
	else
		select '不能被三整除';
		end if;
end;
-- 调用过程
call mypro3(7);

运行结果:
在这里插入图片描述


2、 case 条件

case 是另一个条件判断的语句,类似于编程语言中的 choose、when 语法。MySQL 中的 case 语句有两种语法格式。

案例:

1、定义存储过程,输入一个整数,使用 case 语句判断是正数还是负数

create procedure mypro4(in num int)
begin
case -- 条件开始
when num<0 then select '负数';
when num=0 then select '不是正数也不是负数';
else select '正数';
end case; -- 条件结束
end;

-- 调用过程
call mypro4(1);

运行结果:
在这里插入图片描述
2、定义存储过程,输入一个整数,使用 case 语句判断是 1 还是 2

-- 创建过程
create procedure mypro5(in num int)
begin
	CASE num -- 条件开始
		when 1 then select '数值是1';
		when 2 then select '数值是2';
		else select '不是1也不是2';
	end case;-- 条件结束
end;
-- 调用过程
call mypro5(1);

运行结果:
在这里插入图片描述


3、while 循环语句

while 语句的用法和 java 中的 while 循环类似。

案例:

1、定义存储过程,使用 while 循环输出 1 到 10 的累加和

-- 计算1+2+3+4+...+10的和
create procedure mypro6(out sum int)
begin
	declare  i int default 0 ;
	set sum=0;
	while i<10 do
		set i=i+1;
		set sum=sum+i;
	end while;
end;

call mypro6(@f);
select @f;-- @f为自己定义,可以随意取名

运行结果:
在这里插入图片描述


4、repeat 循环语句

repeat 语句的用法和 java 中的 do…while 语句类似,都是先执行循环操作,再判断条件,区别是 repeat 表达式值为 false 时才执行循环操作,直到表达式值为 true 停止。

案例:

1、定义存储过程,使用 repeat 循环输出 1 到 10 的累加和

-- 创建过程
create procedure mypro7(out sum int)
begin 
	declare num int default 0;
	set sum=0;
	repeat -- 循环开始
		set num=num+1;
		set sum=sum+num;
	until num>=10
	end repeat;-- 循环结束
end;
-- 调用过程
call mypro7(@sum);
select @sum

运行结果:
在这里插入图片描述


5、loop 循环语句

循环语句,用来重复执行某些语句。执行过程中可使用 leave 语句或 iterate 跳出循环,也可以嵌套 IF 等判断语句。

  1. leave 语句效果相当于 java 中的 break,用来终止循环;
  2. iterate 语句效果相当于 java 中的 continue,用来结束本次循环操作,进入下一次循环。

案例:

1、定义存储过程,使用 loop 循环输出 1 到 10 的累加和

-- 创建过程
create procedure mypro8(out sum int)
begin
	declare num int default 0;
	set sum=0;
	loop_sum:loop -- 循环开始
		set num=num+1;
		set sum =sum+num;
		if num>=10 then
			leave loop_sum;
		end if;
	end loop loop_sum;-- 循环结束
end;
-- 调用过程
call mypro8(@sum);
select @sum-- 查看结果

运行结果:
在这里插入图片描述


存储过程的管理

1、显示存储过程

  1. 使用视图工具Navicat找到函数列表可以进行查看
  2. 使用sql语句进行查看:
SHOW PROCEDURE STATUS;
  1. 显示特定数据库的存储过程
SHOW PROCEDURE status where db = '数据库名';

  1. 显示特定模式的存储过程,要求显示名称中包含“my”的存储过程
SHOW PROCEDURE status where name like '%my%';

2、显示存储过程源码

显示存储过程“mypro1”的源码

SHOW CREATE PROCEDURE mypro1;

3、删除存储过程

删除存储过程“mypro1”

drop PROCEDURE mypro1;

练习: 1、计算1-100能被5整除的数字之和
create procedure mypro9(out sum int)
begin
	declare i int default 1;
	set sum=0;
	while i<100 do
	set i=i+1;
	if i%5=0 then
	set sum=sum+i;
	end if;
	end while;
end;
call mypro9(@f);
select @f

2、计算1-100既能被三整除,又能被5整除的数字之和

create procedure mypro10(out sum int)
begin
	declare i int default 1;
	set sum=0;
	while i<100 do
	set i=i+1;
	if i%15=0 then
	set sum=sum+i;
	end if;
	end while;
end;
call mypro10(@f);
select @f

你可能感兴趣的:(mysql)