存储过程和存储函数是事先经过编译并存储在数据库中的一段SQL语句的集合。

优点:提高代码的复用性;减少数据在数据库和应用服务器中的传输,提高效率;减少代码层面的业务处理。

存储过程和函数的区别:存储函数必须有返回值;存储过程可以没有返回值。

存储过程的创建和调用

1,创建存储过程

-- 修改结束分隔符
DELIMITER  $
-- 创建存储过程
CREATE  PROCEDURE  存储过程名称(参数列表)
BEGIN
	SQL语句列表 ;
-- 修改结束分隔符
DELIMITER ;

2,调用存储过程

CALL  存储过程名称(实际参数);

3,存储过程的查看

SELECT  *  FROM  mysql.proc  WHERE  db='数据库名';

4,存储过程的删除

DROP  PROCEDURE  IF  EXISTS  存储过程名;

存储过程语法

变量的使用:

-- 定义变量
	DECLARE  变量名  数据类型;
	-- 为变量赋值
	两种方式
	-- 使用变量
	SELECT  变量名;

变量赋值两种方式

方式一

/*
	为变量赋值  方式一
	SET 变量名=变量值;
*/
-- 修改结束分隔符
DELIMITER $
-- 创建存储过程
CREATE PROCEDURE test2()
BEGIN
	-- 定义变量
	DECLARE NAME VARCHAR(10);
	-- 为变量赋值
	SET NAME ='存储过程';
	-- 使用变量
	SELECT NAME;
END$
-- 将结束分割符修改为原来的;
DELIMITER ;

CALL test2();

方式二

/*
	为变量赋值  方式二
	SELECT 列名 INTO 变量名 FROM 表名 [WHERE 条件];
*/
-- 定义两个int变量,用于存储男女同学的总分数
-- 修改结束分隔符
DELIMITER $
-- 创建存储过程
CREATE PROCEDURE test3()
BEGIN
	-- 定义两个变量
	DECLARE men,women INT;
	-- 查询出男同学的总分数,为men赋值
	SELECT SUM(score) INTO men FROM student WHERE gender='男';
	-- 查询出女同学的总分数,为men赋值
	SELECT SUM(score) INTO women FROM student WHERE gender='女';
	-- 使用变量
	SELECT men,women;
END$
-- 将结束分割符修改为原来的;
DELIMITER ;
-- 使用存储过程
CALL test3();

if语句的使用

mysql 存储过程的互调用 mysql存储过程调用函数_mysql

-- 定义一个int变量,用于存储班级总成绩额
-- 定义一个varchar变量,用于存储分数描述
-- 修改结束分隔符
DELIMITER $
-- 创建存储过程
CREATE PROCEDURE test4()
BEGIN
	-- 定义变量
	DECLARE total INT;
	DECLARE info VARCHAR(10);
	-- 查询总成绩赋值给total
	SELECT SUM(score) INTO total FROM student;
	-- 条件判断
	IF total >200 THEN 
		SET info='学习优秀';
	ELSEIF total>=100 AND total<=200 THEN
		SET info='学习不错';
	ELSE
		SET info='学习一般';
	END IF;
	-- 查询总成绩和描述信息
	SELECT total, info;
END$
-- 将结束分割符修改为原来的;
DELIMITER ;

CALL test4();

参数传递

mysql 存储过程的互调用 mysql存储过程调用函数_数据库_02

/*
	参数传递
*/
-- 输入总成绩变量,代表学生总成绩
-- 输出分数描述变量,代表学生总成绩的描述信息
-- 根据总成绩进行判断
-- 修改结束分隔符
DELIMITER $
-- 创建存储过程
CREATE PROCEDURE test5(IN total INT, OUT info VARCHAR(10))
BEGIN
	-- 对总成绩进行条件判断
	IF total >200 THEN 
		SET info='学习优秀';
	ELSEIF total>=100 AND total<=200 THEN
		SET info='学习不错';
	ELSE
		SET info='学习一般';
	END IF;
END$
-- 将结束分割符修改为原来的;
DELIMITER ;

CALL test5(10, @info);
CALL test5((SELECT SUM(score) FROM student), @info);
SELECT @info;

while循环

mysql 存储过程的互调用 mysql存储过程调用函数_mysql 存储过程 嵌套调用_03

/*
	while循环
*/
-- 计算1~100之间的偶数和
DELIMITER $
CREATE PROCEDURE test6()
BEGIN
	-- 定义求和变量,设置默认值为0
	DECLARE result INT DEFAULT 0;
	-- 定义初始化变量
	DECLARE num INT DEFAULT 1;
	-- while循环
	WHILE num<=100 DO
		-- 对num进行判断
		IF num%2=0 THEN
			SET result = result+num;
		END IF;
		SET num=num+1;
	END WHILE;
	-- 查询求和结果
	SELECT result;
END$
DELIMITER ;

CALL test6();

存储函数

mysql 存储过程的互调用 mysql存储过程调用函数_mysql 存储过程 嵌套调用_04


在存储过程中使用到的语法在存储函数中也就能够使用,二者非常相似。

/*
	存储函数
*/
-- 获取学生表中成绩大于95分的学生的数量
DELIMITER $
CREATE FUNCTION function01()
RETURNS INT
BEGIN
	-- 定义一个变量,记录成绩大于95分学生变量
	DECLARE s_count INT;
	-- 查询成绩大于95分学生的数量,为s_count赋值
	SELECT COUNT(*) INTO s_count FROM student WHERE score>95;
	-- 返回统计结果
	RETURN s_count;
END$
DELIMITER ;

SELECT function01();

-- 删除函数
DROP FUNCTION IF EXISTS function01;