MySQL高级存储过程

学习目标:存储过程

了解存储过程的优缺点
熟练掌握存储过程的基本语法
掌握存储过程的管理


学习内容:

1、存储过程简介 为什么要用存储过程? 大多数 SQL 语句都是针对一个或多个表的单条语句。并非所有的操作都那么简单。经常会有一个完整的操作 需要多条语句才能完成。存储过程简单来说,就是为以后的使用而保存的一条或多条 MySQL 语句的集合。可将 其视为批处理文件。虽然他们的作用不仅限于批处理。 存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
存储过程的优点
1) 通过把处理封装在容易使用的单元中,简化复杂的操作; 
2) 简化对变动的管理。如果表名、列名或业务逻辑有变化。只需要更改存储过程的代码,使用它的人员不 会改自己的代码; 
3) 通常存储过程有助于提高应用程序的性能。当创建的存储过程被编译之后,就存储在数据库中。 但是, MySQL 实现的存储过程略有不同。MySQL 存储过程按需编译。在编译存储过程之后,MySQL 将其放入 缓存中。MySQL 为每个连接维护自己的存储过程高速缓存。如果应用程序在单个连接中多次使用存储 过程,则使用编译版本,否则存储过程的工作方式类似于查询; 
4) 存储过程有助于减少应用程序和数据库服务器之间的流量,因为应用程序不必发送多个冗长的 SQL 语 句,而只用发送存储过程的名称和参数;
 5) 存储的程序对任何应用程序都是可重用的和透明的。存储过程将数据库接口暴露给所有应用程序,以便 开发人员不必开发存储过程中已支持的功能; 
 6) 存储的程序是安全的。数据库管理员可以向访问数据库中存储过程的应用程序授予适当的权限,而不向 基础数据库表提供任何权限。
 存储过程的缺点
 1) 如果使用大量存储过程,那么使用这些存储过程的每个连接的内存使用量将会大大增加。 此外,如果 您在存储过程中过度使用大量逻辑操作,则 CPU 使用率也会增加,因为 MySQL 数据库最初的设计侧重 于高效的查询,不利于逻辑运算; 
 2) 存储过程的构造使得开发具有复杂业务逻辑的存储过程变得更加困难; 
 3) 很难调试存储过程。只有少数数据库管理系统允许您调试存储过程。不幸的是,MySQL 不提供调试存 储过程的功能; 
 4) 开发和维护存储过程并不容易。开发和维护存储过程通常需要一个不是所有应用程序开发人员拥有的专 业技能。这可能会导致应用程序开发和维护阶段的问题。

2、 MySQL 中的存储过程
创建与调用过程

-- 创建存储过程 
	create procedure mypro(in a int,in b int,out sum int)
	begin
	 	set sum = a+b;
	end;
call mypro(1,2,@s);-- 调用存储过程 
select @s;-- 显示过程输出结果

存储过程语法解析
 create procedure 用来创建过程;
 mypro 用来定义过程名称;
 (in a int,in b int,out sum int)表示过程的参数,其中 in 表示输入参数,out 表示输出参数。类似于 Java 定 义方法时的形参和返回值;
 begin 与 end 表示过程主体的开始和结束,相当于 Java 定义方法的一对大括号;
 call 用来调用过程,@s 是用来接收过程输出参数的变量。
存储过程的参数
MySQL 存储过程的参数用在存储过程的定义,共有三种参数类型:
 IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量);
 OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量);
 INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)。
变量
1) 变量定义

DECLARE variable_name [,variable_name...] datatype [DEFAULT value];

 declare 用于声明变量;
 variable_name 表示变量名称;
 datatype 为 MySQL 的数据类型;
 default 用于声明默认值;
 例如:declare name varchar(20) default ‘jack’。
2) 变量赋值

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

在存储过程中使用变量

create procedure myprol1()
begin
	declare username1 varchar(16);-- 声明
	set username1='张三';-- 赋值
	select * from mytable where username=username1;-- 条件查询
end;
call myprol1();

流程控制语句

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

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

create PROCEDURE myprol2(in num int)
BEGIN
	if num<0 THEN
		select '负数';
	elseif num=0 THEN
		select '不是正数也不是负数';
	else
		select '正数'; 
	end if;-- 条件结束 end;
end;
call myprol2(1);

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

create procedure myprol4(in num int)
begin
	case num -- 条件开始 
		when 1 then select '数值是 1'; 
		when 2 then select '数值是 2'; 
		else select '不是 1 也不是 2'; 
	end case; 
end; 
call myprol4(3);
  1. while 循环语句
    while 语句的用法和 java 中的 while 循环类似。
CREATE PROCEDURE myprol5(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 myprol5(@l);
SELECT @l;

3、 存储过程的管理
显示存储过程

SHOW PROCEDURE STATUS;

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

SHOW PROCEDURE STATUS where db='sqlgj1';

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

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

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

show create procedure mypro1;

删除存储过程“mypro1”

drop PROCEDURE mypro1;

学习产出:

1、 了解存储过程的优缺点;
2、 熟练掌握创建和调用过程的语法;
3、 在过程中使用变量与流程控制语句;
4、 掌握存储过程的管理。

你可能感兴趣的:(mysql)