存储过程和存储函数是事先经过编译并存储在数据库中的一段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语句的使用
-- 定义一个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();
参数传递
/*
参数传递
*/
-- 输入总成绩变量,代表学生总成绩
-- 输出分数描述变量,代表学生总成绩的描述信息
-- 根据总成绩进行判断
-- 修改结束分隔符
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循环
/*
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();
存储函数
在存储过程中使用到的语法在存储函数中也就能够使用,二者非常相似。
/*
存储函数
*/
-- 获取学生表中成绩大于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;