简单的存储过程
2018-05-30 本文已影响10人
啊哈JC熙
存储过程
参考资料:https://www.cnblogs.com/mark-chan/p/5384139.html
存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
使用CALL语句来调用存储过程
#存储过程IN参数
DELIMITER //
CREATE PROCEDURE procedure_in_param(IN p_in FLOAT)
BEGIN
SELECT p_in;
SET p_in=2;
SELECT p_in;
END;
//
DELIMITER ;
#调用
SET @p_in=5.1;
CALL procedure_in_param(@p_in);
SELECT @p_in;
USE iris_data
SELECT sepal_length from iris WHERE sepal_length >= 3;
select target,count(target) from iris group by target;
# // 要必须加
DELIMITER //
CREATE PROCEDURE procedure_target(IN set_target VARCHAR(100))
BEGIN
IF set_target = "setosa" THEN
SELECT * FROM iris WHERE target=set_target;
ELSEIF set_target = "123" THEN
SET set_target = "123+++";
SELECT set_target;
ELSE
SELECT set_target;
END IF;
END
//
DELIMITER ;
DROP PROCEDURE procedure_target;
SET @set_ta="setosa";
CALL procedure_target(@set_ta);
CALL procedure_target("123")
CALL procedure_target("13432")
SELECT * FROM iris WHERE target="setosa";
# 让存储过程输出结果
DELIMITER //
CREATE PROCEDURE procedure_target1(IN set_target VARCHAR(100))
BEGIN
SELECT * FROM iris WHERE target=set_target;
END
//
DELIMITER ;
SET @set_ta1="versicolor";
CALL procedure_target1(@set_ta1);
事务 回滚
主要用于处理操作量大,复杂度高的数据。
BEGIN 开始一个事务
ROLLBACK 事务回滚
COMMIT 事务确认
游标
# ********************************** 游标 *****************************************
# cursor 游标 存放SQL语句执行的结果
# 分离select结果
# 在数据量大的情况下,是不适用的,速度过慢
# 使用场景:从表中循环判断并得到想要的结果集
# delimiter 定界符
DROP PROCEDURE if EXISTS cursor_test;
delimiter //
create procedure cursor_test()
BEGIN
-- 声明变量
declare sepal_length FLOAT;
declare sepal_width FLOAT;
declare petal_length FLOAT;
declare petal_width FLOAT;
declare target VARCHAR(100);
-- 1.定义一个游标
declare cursor1 cursor for SELECT * from `iris`;
-- 2.打开游标
open cursor1;
-- 3.使用游标获取列的值
fetch next from cursor1 into sepal_length,sepal_width,petal_length,petal_width,target;
-- 4.显示结果
SELECT sepal_length,sepal_width,petal_length,petal_width,target;
-- 5.关闭游标
CLOSE cursor1;
END;
//
delimiter
CALL cursor_test()
# *********** 循环读取 ***********
DROP PROCEDURE if EXISTS cursor_test1;
delimiter //
create procedure cursor_test1()
BEGIN
-- 声明变量
declare sepal_length FLOAT;
declare sepal_width FLOAT;
declare petal_length FLOAT;
declare petal_width FLOAT;
declare target VARCHAR(100);
declare done varchar(20) default '';
-- 1.定义一个游标
declare cursor2 cursor for SELECT * from `iris`;
-- 声明一个越界标识done:continue当not found之后,还会继续执行一次select语句
-- SQLSTATE '02000' 是游标到最后一行之后没有发现数据,表中select可能也没有查询打开数据
declare CONTINUE HANDLER FOR SQLSTATE '02000' SET done = null;
-- 2.打开游标
open cursor2;
-- 3.使用游标获取列的值
fetch next from cursor2 into sepal_length,sepal_width,petal_length,petal_width,target;
WHILE( done is not null ) DO
-- 4.显示结果
IF target = "A" THEN
SELECT sepal_length,sepal_width,petal_length,petal_width,target;
END IF;
fetch next from cursor2 into sepal_length,sepal_width,petal_length,petal_width,target;
END WHILE;
-- 5.关闭游标
CLOSE cursor2;
END;
//
delimiter
# 注意end while后面有;
CALL cursor_test1()
SELECT * from `iris`