版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jt102605/article/details/87860626
MySQL命令的执行流程
存储过程
存储过程是SQL语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理
优点:
- 增强SQL语句的功能和灵活性
- 实现较快的执行速度
- 减少网络流量
创建存储过程
CREATE
[DEFINER = {user | CURRENT_USER}]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
[DEFINER = {user | CURRENT_USER}] 指定存储过程的创建者
proc_parameter :[ IN | OUT | INOUT ] param_name type
- IN, 表示该参数的值必须在调用存储过程时来指定
- OUT,表示该参数的值可以被存储过程改变,并且可以返回
- INOUT,表示该参数在调用时指定,并且可以被改变和返回
过程体
- 过程体由合法的SQL语句构成
- 如果为复合语句则使用 BEGIN...END 语句
- 复合结构可以包含声明,循环,控制结构
//不带参数的存储过程
CREATE PROCEDURE sp1()
SELECT VERSION();
//带有 IN参数 的存储过程
//修改语句结束符
DELIMITER //
//创建存储过程
CREATE PROCEDURE removeUserByID(IN p_id INT UNSIGNED)
BEGIN
DELETE FROM users WHERE id=p_id;
END
//
//将语句结束符修改回来
DELIMITER ;
//带有 IN参数 和 OUT参数 的存储过程
//修改语句结束符
DELIMITER //
//创建存储过程
CREATE PROCEDURE deleteUserAndReturnUserNums(IN p_id INT UNSIGNED, OUT userNums INT UNSIGNED)
BEGIN
DELETE FROM users WHERE id=p_id;
SELECT COUNT(id) FROM users INTO userNums;
END
//
//将语句结束符修改回来
DELIMITER ;
//带有 OUT参数 存储过程的调用
CALL deleteUserAndReturnUserNums(2, @nums);
SELECT @nums;
@nums 是用户变量,其不同于局部变量,用户变量在客户端上对某个用户有效
SET @i = 7;
//创建带有多个 OUT参数 的存储过程
//修改语句结束符
DELIMITER //
//创建存储过程
CREATE PROCEDURE removeUserByAgeAndReturnInfos (IN p_age SMALLINT UNSIGNED, OUT deleteUsers SMALLINT UNSIGNED, OUT userCounts SMALLINT UNSIGNED)
BEGIN
DELETE FROM users WHERE age = p_age;
SELECT ROW_COUNT() INTO deleteUsers;
SELECT COUNT(id) FROM users INTO userCounts;
END
//
//将语句结束符修改回来
DELIMITER ;
注:MySQL的系统函数 ROW_COUNT() 可以获取被增加、删除 以及修改的记录数目
调用存储过程
//创建的存储过程不带参数时,sp_name后可以带有小括号也可以不带;
//而创建的存储过程带有参数时,则sp_name后必须带有小括号
CALL sp_name([parameter[,...]]);
CALL sp_name;
删除存储过程
DROP PROCEDURE [IF EXISTs] sp_name;
存储过程与自定义函数的区别
- 存储过程实现的功能要更复杂一些,多用于对数据标的处理;而函数的针对性更强
- 存储过程可以返回多个值;函数只能有一个返回值
- 存储过程一般独立的执行,即通过关键字 "CALL" 来调用;而函数可以作为其他SQL语句的组成部分来实现