- 存储过程和函数都是事先在数据库中经过执行一段sql语句的集合,存储过程没有返回值,而函数必须有返回值,使用存储过程可以减少数据在数据库和应用服务器之间的传输,简化开发人员的工作。
- 创建存储过程
CREATE PROCEDURE pro_name()
BEGIN
---sql语句
END;
2.1 调用存储过程
call pro_name();
2.2 删除存储过程
DROP PROCEDURE IF EXISTS pro_name ;
3.存储过程语法
3.1 变量
--DECLARE定义变量,SET进行赋值,也可以用select into赋值
CREATE PROCEDURE PRO_TEST()
BEGIN
DECLARE NUM INT DEFAULT 2;
SET NUM =NUM+3;
SELECT COUNT(1) INTO NUM FROM TABLE_NAME;
END;
3.2 if条件判断
--if条件判断demo
CREATE PROCEDURE pro_demo()
BEGIN
DECLARE height INT DEFAULT 170;
DECLARE description VARCHAR(50);
IF
height >= 180 THEN SET description = '偏高';
ELSEIF
height >= 170 AND height < 180 THEN SET description = '标准';
ELSE
SET description = '偏低';
END IF;
SELECT description;
END;
3.3 传递参数
-- in作为输入参数(默认参数);out作为输出参数;inout可以作为输出参数,也可以作为输入参数
-- @description 代表这个会话是有效的,@@description 代表是系统变量
DROP PROCEDURE IF EXISTS pro_demo;
CREATE PROCEDURE pro_demo(in height int , out description varchar(50))
BEGIN
IF
height >= 180 THEN SET description = '偏高';
ELSEIF
height >= 170 AND height < 180 THEN SET description = '标准';
ELSE
SET description = '偏低';
END IF;
END;
call pro_demo(171,@description);
select @description;
3.4 case 结构
--case语句结构
DROP PROCEDURE IF EXISTS pro_demo;
CREATE PROCEDURE pro_demo(in height int )
BEGIN
DECLARE result varchar(50);
CASE
WHEN height >= 180 THEN SET result = '偏高';
WHEN height >= 170 AND height < 180 THEN SET result = '标准';
WHEN height<170 THEN SET result = '偏低';
END CASE;
select concat('输入的是:',height,' 身高为:',result) as conmment;
END;
3.5 循环结构
-- while循环满足条件就循环
DROP PROCEDURE IF EXISTS pro_demo;
CREATE PROCEDURE pro_demo( m INT )
BEGIN
DECLARE total INT DEFAULT 0;
DECLARE num INT DEFAULT 1;
WHILE
num <= m DO
SET total = total + num;
SET num = num + 1;
END WHILE;
SELECT total;
END ;
-- repeat循环满足条件就退出
DROP PROCEDURE IF EXISTS pro_demo;
CREATE PROCEDURE pro_demo( m INT )
BEGIN
DECLARE total INT DEFAULT 0;
REPEAT
SET total = m + total;
SET m = m-1;
UNTIL m=0
END REPEAT;
SELECT total;
END ;
-- loop和leave循环语句
DROP PROCEDURE IF EXISTS pro_demo;
CREATE PROCEDURE pro_demo( m INT )
BEGIN
DECLARE total INT DEFAULT 0;
label: LOOP
SET total = m + total;
SET m = m-1;
IF m=0 THEN
LEAVE label;
END IF;
END LOOP label;
SELECT total;
END ;
3.6 游标
-- 游标用来存储查询结果集的数据类型,可以在循环中对结果集进行处理
-- 声明游标
DECLARE cursor_name CURSOR FOR select_statement ;
-- 打开游标
OPEN cursor_name;
-- fetch游标
FETCH cursor_name INTO var_name ...
-- 关闭游标
CLOSE cursor_name ;
drop procedure if exists temp_export;
create procedure temp_export()
begin
declare temp_code varchar(30); # 声明变量
declare temp_time varchar(10);
declare temp_pro varchar(10);
declare flag int default 0;
declare result_sql varchar(50000) default '';
# 这是重点,定义一个游标来记录sql查询的结果
declare s_list cursor for select code ,time_attribute ,region from big_temp_data group by code,time_attribute,region;
# 为下面while循环建立一个退出标志,当游标遍历完后将flag的值设置为1
declare continue handler for not found set flag=1;
open s_list; # 打开游标
while flag <> 1 do
# 将游标中的值赋给定义好的变量,实现for循环的要点
fetch s_list into temp_code, temp_time,temp_pro;
if result_sql <> '' then
set result_sql = concat(result_sql," union all ","( select * from big_temp_data where code = '",temp_code,
"' and time_attribute = '",temp_time,"'and region = '",temp_pro,"' order by time desc limit 0,2 )");
else
set result_sql = concat("(select * from big_temp_data where code = '",temp_code,"' and time_attribute = '",temp_time,"'
and region = '",temp_pro,"' order by time desc limit 0,2 )");
end if;
set @sql = result_sql ;
end while;
close s_list; # 关闭游标
PREPARE stmt FROM @sql;
EXECUTE stmt ;
deallocate prepare stmt;
end ;
call temp_export(); # 调用
4:存储函数
-- while循环满足条件就循环
DROP PROCEDURE IF EXISTS pro_demo;
CREATE FUNCTION pro_demo( m INT )
RETURNS INT
BEGIN
DECLARE total INT DEFAULT 0;
DECLARE num INT DEFAULT 1;
WHILE
num <= m DO
SET total = total + num;
SET num = num + 1;
END WHILE;
RETURN total;
END ;
select pro_demo(100)