[数据库]MYSQL之存储过程

时间:2020-03-21 02:59:54   收藏:0   阅读:64

一 存储过程的特点

MySQL 5.0 版本开始支持存储过程

1.1 定义

1.2 优点

1.3 缺点

尽管有这些缺陷,存储过程还是非常有用的,并且应该尽可能地使用。

1.4 具体业务场景

迄今为止,使用的大多数SQL语句都是针对一个或多个表的单条语句。并非所有操作都这么简单,经常会有一个完整的操作需要多条语句才能完成。例如,考虑以下的情形。

1.5 适用场景:简单、安全、高性能

二 存储过程的使用 -- 创建与调用

2.1 无参数的存储过程

-- DELIMITER $$ # [可选项]声明语句结束符 - 将语句的结束符号从分号;临时改为两个$$(即 可自定义)
DROP PROCEDURE IF EXISTS procedure_view_all_student;
CREATE PROCEDURE procedure_view_all_student() -- 查看所有学生信息
BEGIN -- 1执行段 - 起始 
    DECLARE varName INT DEFAULT 0;  -- 变量 de 声明
    SET varName = 100+1; -- 变量 de 赋值(SET =) 1
    # 变量(varName)
    # 变量的使用: 必须先声明,才能后使用
    # 变量的声明格式: DECLARE variable_name datatype(size) [DEFAULT default_value];
    SELECT COUNT(*) INTO varName FROM Student; -- 变量 de 赋值(SELECT INTO) 2
    SELECT varName AS '总人数'; -- 变量 de 输出
END; -- 2执行段 - 结束
-- END $$
CALL procedure_view_all_student;

2.2 仅含输入参数(IN)的存储过程

DROP PROCEDURE IF EXISTS procedure_view_select_course_of_one_student; -- 查看 指定某一学生的选课信息
CREATE PROCEDURE procedure_view_select_course_of_one_student(IN sno CHAR(9))
BEGIN
    SELECT * FROM select_course AS sc WHERE sc.sno = sno;
END; 
CALL procedure_view_select_course_of_one_student('201215121');

2.3 仅含输出参数(OUT)的存储过程

DROP PROCEDURE IF EXISTS procedure_view_total_student; -- 查看 总共的学生数目
CREATE PROCEDURE procedure_view_total_student(OUT total INT)
BEGIN
    SELECT COUNT(*)
        INTO total
        FROM select_course AS sc;
END;
CALL procedure_view_total_student(@total_student);
SELECT @total_student AS '学生总人数';

2.4 含又作输出又作输入参数(INOUT)的存储过程

DROP PROCEDURE IF EXISTS procedure_create_huge_test_records_for_student; 
CREATE PROCEDURE procedure_create_huge_test_records_for_student(INOUT records_num INT) -- 插入 指定数目的学生信息的测试数据
BEGIN
    DECLARE sno CHAR(9);
    DECLARE sname VARCHAR(30);
    DECLARE ssex VARCHAR(2) DEFAULT '男';
    DECLARE sage SMALLINT DEFAULT 29;
    DECLARE sdept VARCHAR(50) DEFAULT 'MS';

    DECLARE counter INT;
    SET counter = records_num;
    START TRANSACTION; -- 整个存储过程指定为1个事务
    -- ↑ 大量插删数据时,追加事务可避免插删每条数据时频繁的磁盘IO交互,便不再受磁盘IO限制,暂存到了内存缓存区,以此大大提高速度
        WHILE counter >= 1 DO
            SELECT MID(UUID(), 1, 9) INTO sno; -- 从36位的字符串UUID()中的第1个位置截取9个字符:
            SELECT MID(UUID(), 1, 5) INTO sname;
            insert into Student (`sno`, `sname`, `ssex`, `sage`, `sdept`) VALUES(sno, sname, ssex, sage, sdept);
            SET counter = counter - 1;
        END WHILE;
    COMMIT; -- 必须主动提交
END;
SET @records_num = 200000; #插入20万条数据 总计 36.296秒(启用了事务 start transaction + sql... + commit)
call procedure_create_huge_test_records_for_student(@records_num);
SELECT * FROM student WHERE student.sno= '1231546-';

三 存储过程的使用 -- 查看与删除

1.1 查看指定表的存储过程

技术分享图片
1.1.1 查看 表内的存储过程 【基本信息】
-- 语法格式: SHOW {PROCEDURE | FUNCTION} STATUS [LIKE ‘pattern’]
SHOW PROCEDURE STATUS;
技术分享图片
1.1.2 查看 表内的存储过程 【详细信息】
SHOW CREATE PROCEDURE indexName;

3.2 删除 存储过程

DROP PROCEDURE IF EXISTS indexName;

4 参考文献

原文:https://www.cnblogs.com/johnnyzen/p/12535274.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!