MySQL高效编程学习笔记(九)--数据库中使用存储过程

由于sql命令是非程序性语言(一个命令实现一个处理),不能编写流程,而储存过程就是数据库中保存一系列sql命令的集合,可以实现较复杂的功能。具有提高执行性能、减轻网络负担、防止对表的直接访问、可将数据处理黑箱子化。

  1. 定义存储过程
    (1)创建存储过程
    create produce 存储过程名(参数种类1 参数1 数据类型1, 参数种类2参数2 数据类型2)
    BEGIN
    处理内容
    END

调用存储过程时可以指定参数,该参数和普通函数参数区别在于,普通函数参数只能输入,而存储过程有IN\OUT\INOUT三种类型。
下面写一个存储过程对城市名ChinesesName进行模糊检索:

DELIMITER //(由于命令集合中包含;的会产生歧义,所以将默认分隔符;变为无关的符号//)
CREATE PROCEDURE sp_search_cityname(IN name VARCHAR(20))
BEGIN
IF name IS NULL OR name='' THEN
SELECT * FROM chinacitycode;
ELSE
		SELECT * FROM chinacitycode WHERE EnglishName LIKE name;
END IF;
END
//
DELIMITER ; #将默认分隔符变回;

在这里插入图片描述
(2)存储过程可使用的控制语句
简单分支:

IF 条件表达式1
	处理内容1
ELSEIF 条件表达式2   (斜体部分代码可省略)
处理内容2
…
ELSE
 处理内容n
END IF;

多重分支:

CASE 表达式1
	WHEN 值1 THEN 
处理内容1
…
	WHEN n THEN   (斜体部分代码可省略)
处理内容n
	ELSE 
处理内容n+1
END CASE;

循环控制(后置判断):

REPEAT
 处理内容1(表达式1为FALSE时一直执行)
UNTIL 表达式1  END REPEAT;

循环控制(前置判断):

WHILE 表达式1 DO
处理内容1
END WHILE;
(3)确认存储过程
查看存储过程是否存在:
SHOW PROCEDURE STATUS \G 

在这里插入图片描述
查看某存储过程详细内容:
SHOW CREATE PROCEDURE sp_search_cityname\G
在这里插入图片描述
删除存储过程 DROP PROCEDURE sp_search_cityname;
在这里插入图片描述
本想删除存储过程后用事务恢复的,结果返回不了,因为DROP命令不在事务处理的利用范围之内。。。
调用存储过程:
CALL 存储过程名(参数 ,…);
CALL sp_search_cityname(‘jin%’);
在这里插入图片描述
在这里插入图片描述
CALL sp_search_cityname(NULL);或CALL sp_search_cityname(’’);查出所有内容
在这里插入图片描述
(5)定义输出参数

DELIMITER //
CREATE PROCEDURE sp_search_cityname(IN name VARCHAR(20),OUT cnt INT)
BEGIN
IF name IS NULL OR name='' THEN
SELECT * FROM chinacitycode;
ELSE
		SELECT * FROM chinacitycode WHERE EnglishName LIKE name;
END IF;
SELECT FOUND_ROWS() INTO cnt;
END
//
DELIMITER ;

函数FOUND_ROWS()获取前一条SELECT语句检索出的记录件数,SELECT …INTO 用于将SELECT 语句取得的结果设置到指定变量cnt中,但此时SELECT语句只能检索出一条记录或者一个值(SELECT 列名1,…INTO 变量名1,…FROM 表明 WHERE 语句等…)。指定OUT参数使用在变量名前加上@,然后使用SELECT @num显示变量名的值,具体如下图;
在这里插入图片描述
(6)定义本地变量
本地变量或局部变量时只能在存储过程中使用的变量,用于保存存储过程的临时值。

DELIMITER //
CREATE PROCEDURE sp_search_cityname2(IN p_depart INT,OUT cnt INT)
BEGIN
DECLARE temp CHAR(6);   #定义本地变量temp
CASE p_depart
WHEN 1 THEN
SET temp = '%jing';
WHEN 2 THEN
SET temp = '%cuan';
   WHEN 3 THEN
SET temp = '%qing';
    ELSE
SET temp = '%hai';
END CASE;
SELECT * FROM chinacitycode WHERE EnglishName LIKE temp;
SELECT FOUND_ROWS() INTO cnt;
END
DELIMITER ;
CALL sp_search_cityname2(1,@name); 

在这里插入图片描述
(7)几个控制语句用例
A. If语句实现多重分支

DELIMITER //
CREATE PROCEDURE sp_search_cityname3(IN p_depart INT,OUT cnt INT)
BEGIN
DECLARE temp CHAR(6);   #定义本地变量temp
IF p_depart = 1 THEN
SET temp = '%jing';
ELSEIF p_depart = 2 THEN
SET temp = '%cuan';
ELSEIF p_depart = 3 THEN
SET temp = '%qing';
ELSE
SET temp = '%hai';
END IF;
SELECT * FROM chinacitycode WHERE EnglishName LIKE temp;
SELECT FOUND_ROWS() INTO cnt;
END
//
DELIMITER ;
CALL sp_search_cityname3(1,@name);

在这里插入图片描述

B. CASE命令上一小节已经讲过了
C. WHILE循环
这里写一个计算阶乘的存储过程

DELIMITER //
CREATE PROCEDURE sp_factorial(IN p_num INT,OUT p_result INT)
BEGIN
SET p_result = 1;
WHILE p_num>1 DO
  SET p_result = p_result * p_num;
SET p_num = p_num - 1;
END WHILE;
END
//
DELIMITER ; # DELIMITER后一定要有空格
CALL sp_factorial (5,@num);

在这里插入图片描述
在这里插入图片描述
D. REPEAT循环实现阶乘

DELIMITER //
CREATE PROCEDURE sp_factorial2(IN p_num INT,OUT p_result INT)
BEGIN
SET p_result = 1;
REPEAT
  SET p_result = p_result * p_num;
SET p_num = p_num - 1;
UNTIL p_num <= 1 END REPEAT; 
END
//
DELIMITER ; # DELIMITER后一定要有空格
CALL sp_factorial2(5,@num);
SELECT @num;

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/HuYingJie_1995/article/details/88684436