MySQL进阶——存储过程

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

MySQL 存储过程

1、简介

大多数 SQL 语句都是针对一个或多个表的单条语句。并非所有的操作都那么简单。经常会有一个完整的操作需要多条语句才能完成。

存储过程简单来说就是为以后的使用而保存的一条或多条 MySQL 语句的集合。可将其视为批处理文件。虽然他们的作用不仅限于批处理。

存储过程的优点

  1. 通过把处理封装在容易使用的单元中简化复杂的操作
  2. 简化对变动的管理。如果表名、列名或业务逻辑有变化。只需要更改存储过程的代码使用它的人员不会改自己的代码
  3. 通常存储过程有助于提高应用程序的性能。当创建的存储过程被编译之后就存储在数据库中。 但是MySQL 实现的存储过程略有不同。MySQL 存储过程按需编译。在编译存储过程之后MySQL 将其放入缓存中。MySQL 为每个连接维护自己的存储过程高速缓存。如果应用程序在单个连接中多次使用存储过程则使用编译版本否则存储过程的工作方式类似于查询
  4. 存储过程有助于减少应用程序和数据库服务器之间的流量因为应用程序不必发送多个冗长的 SQL 语句而只用发送存储过程的名称和参数
  5. 存储的程序对任何应用程序都是可重用的和透明的。存储过程将数据库接口暴露给所有应用程序以便开发人员不必开发存储过程中已支持的功能
  6. 存储的程序是安全的。数据库管理员可以向访问数据库中存储过程的应用程序授予适当的权限而不向基础数据库表提供任何权限。

存储过程的缺点

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

创建与调用过程

创建存储过程代码如下所示

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

运行结果如下

 存储过程语法解析

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

存储过程的参数

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

存储过程根据参数可分为四种类别

1).没有参数的过程

2).只有输入参数的过程

3).只有输出参数的过程

4).包含输入和输出参数的过程。

变量

MySQL 中的存储过程类似 java 中的方法。

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

变量定义

DECLARE variable_name [,variable_name...] datatype [DEFAULT value];
  • declare用于声明变量

  • variable_name表示变量名称

  • datatype为 MySQL 的数据类型

  • default用于声明默认值;

  • 例如

declare name varchar(20) default ‘jack’。

变量赋值

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

在存储过程中使用变量代码如下所示

use schooldb;-- 使用 schooldb 数据库
-- 创建过程
create procedure mypro1()
begin
declare name varchar(20);
set name = '丘处机';
select * from studentinfo where studentname = name;
end;
-- 调用过程
call mypro1();

运行结果

 

流程控制语句

if 条件语句

IF 语句包含多个条件判断根据结果为 TRUEFALSE执行语句与编程语言中的 ifelse ifelse 语法类似。

定义存储过程输入一个整数使用 if 语句判断是正数还是负数代码如下所示

-- 创建过程
create procedure mypro2(in num int)
begin
if num<0 then -- 条件开始
select '负数';
elseif num=0 then
select '不是正数也不是负数';
else
select '正数';
end if;-- 条件结束
end;
-- 调用过程
call mypro2(-1);

运行结果

case 条件语句

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

定义存储过程输入一个整数使用 case 语句判断是正数还是负数代码如下所示

-- 创建过程
create procedure mypro3(in num int)
begin
case -- 条件开始
when num<0 then select '负数';
when num=0 then select '不是正数也不是负数';
else select '正数';
end case; -- 条件结束
end;
-- 调用过程
call mypro3(1);

 定义存储过程输入一个整数使用 case 语句判断是 1 还是 2代码如下所示

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

运行结果

while 循环语句

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

定义存储过程使用 while 循环输出 1 到 10 的累加和代码如下所示

 

-- 创建过程
create procedure mypro5(out sum int)
begin
declare num int default 0;
set sum = 0;
while num<10 do -- 循环开始
set num = num+1;
set sum = sum+num;
end while; -- 循环结束
end;
-- 调用过程
call mypro5(@sum);
-- 查询变量值
select @sum;

repeat 循环语句

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

定义存储过程使用 repeat 循环输出 1 到 10 的累加和代码如下所示

-- 创建过程
create procedure mypro6(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 mypro6(@sum);
-- 查询变量值
select @sum;

loop 循环语句

循环语句用来重复执行某些语句。

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

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

定义存储过程使用 loop 循环输出 1 到 10 的累加和代码如下所示
 

-- 创建过程
create procedure mypro7(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 mypro7(@sum);
-- 查询变量值
select @sum;

存储过程的管理

存储过程的管理主要包括显示过程、显示过程源码、删除过程。

比较简单的方式就是利用 navicat 客户端工具进行管理鼠标点击操作即可如下图所示

显示存储过程 

SHOW PROCEDURE STATUS;

显示特定数据库的存储过程

SHOW PROCEDURE status where db = 'schooldb';

显示特定模式的存储过程要求显示名称中包含“my”的存储过程

SHOW PROCEDURE status where name like '%my%';

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

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

删除存储过程“mypro1”

drop PROCEDURE mypro1;

 

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: mysql