工作日志

简单的存储过程

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`
上一篇 下一篇

猜你喜欢

热点阅读