MySQL 5.0 版本开始支持存储过程
尽管有这些缺陷,存储过程还是非常有用的,并且应该尽可能地使用。
迄今为止,使用的大多数SQL语句都是针对一个或多个表的单条语句。并非所有操作都这么简单,经常会有一个完整的操作需要多条语句才能完成。例如,考虑以下的情形。
-- 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;
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');
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 '学生总人数';
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-';
-- 语法格式: SHOW {PROCEDURE | FUNCTION} STATUS [LIKE ‘pattern’]
SHOW PROCEDURE STATUS;
SHOW CREATE PROCEDURE indexName;
DROP PROCEDURE IF EXISTS indexName;
原文:https://www.cnblogs.com/johnnyzen/p/12535274.html