MySQL学习_存储过程

版权声明:本文为博主原创文章,未经博主允许不得转载。 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,表示该参数在调用时指定,并且可以被改变和返回

过程体

  1. 过程体由合法的SQL语句构成
  2. 如果为复合语句则使用 BEGIN...END 语句
  3. 复合结构可以包含声明,循环,控制结构
//不带参数的存储过程
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语句的组成部分来实现 

猜你喜欢

转载自blog.csdn.net/jt102605/article/details/87860626