MySQL:存储过程

1. 含义

一组预先编译好的SQL语句的集合

2. 好处

提高代码的重用性
简化操作
减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率

3. 语法

创建

CREATE PROCEDURE 存储过程名 (参数列表)
BEGIN
存储过程体(一组合法的SQL语句)
END

注意:

  1. 参数列表包含三部分:参数模式 参数名 参数类型( 例:IN stuname VARCHAR(20)
  2. 参数模式有三种:
  • IN:该参数可以作为输入,也就是说该参数需要调用方传入值
  • OUT:该参数可以作为输出,也就是该参数可以作为返回值
  • INOUT:该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值
  1. 如果存储过程体只有一条语句,则BEGIN和END可以省略
  2. 存储过程体中的每条SQL语句的结尾要求必须加分号,存储过程的结尾可以使用 DELIMITER 重新设置,例:DELIMITER $

调用

CALL 存储过程名 (实参列表) ;

4. 实例(使用命令行)

空参列表

  • 插入到admin表中五条记录
-- 创建,将语句的结束标记改成$
DELIMITER $ 
CREATE PROCEDURE myp1 () 
BEGIN

INSERT INTO `admin` (`username`, `password`) 
VALUES
  ('费渡', '1234'),
  ('简隋英', '1234'),
  ('李玉', '1234'),
  ('骆闻舟', '1234'),
  ('赵锦辛', '1234') ;

END $
-- 调用
CALL myp1 () $
-- 查看
select * from admin $

带IN模式参数的存储过程

  • 根据女神名去查询对应的男神信息
-- 创建
CREATE PROCEDURE myp2 (IN beauty_name VARCHAR (20)) 
BEGIN

SELECT 
  bo.* 
FROM
  `beauty` AS b 
  RIGHT JOIN `boys` AS bo 
    ON b.`boyfriend_id` = bo.`id` 
WHERE b.`name` = beauty_name ;

END $
-- 调用
CALL myp2 ('费渡') $
  • 判断用户是否登录成功
-- 创建
CREATE PROCEDURE myp3 (
  IN username VARCHAR (10),
  IN `password` VARCHAR (10)
) 
BEGIN

DECLARE nums INT ;
    
SELECT 
  COUNT(*) INTO nums 
FROM
  `admin` AS a 
WHERE a.`username` = username 
  AND a.`password` = `password` ;

SELECT 
  IF (
    nums = 1,
    "登录成功",
    "登录失败"
  ) AS result ;

END $ 
-- 调用
CALL myp3 ('费渡', '1234') $ 

带OUT模式的存储过程

  • 根据女神名,返回对应的男神名
-- 创建
CREATE PROCEDURE myp4 (
  IN beauty_name VARCHAR (50),
  OUT boy_name VARCHAR (20)
) 
BEGIN  

SELECT 
  bo.`boyName` INTO boy_name
FROM
  `beauty` AS b 
  RIGHT JOIN `boys` AS bo 
    ON b.`boyfriend_id` = bo.`id` 
WHERE b.`name` = beauty_name ;

END $ 
-- 调用
CALL myp4 ('费渡', @name) $ 
SELECT 
  @name $  
  • 根据根据女神名,返回对应的男神名和魅力值
-- 创建
CREATE PROCEDURE myp5 (
  IN beauty_name VARCHAR (50),
  OUT boy_name VARCHAR (20),
  OUT user_cp INT
) 
BEGIN  

SELECT 
  bo.`boyName`,
  bo.`userCP` INTO boy_name,
  user_cp 
FROM
  `beauty` AS b 
  RIGHT JOIN `boys` AS bo 
    ON b.`boyfriend_id` = bo.`id` 
WHERE b.`name` = beauty_name ;

END $ 
-- 调用
CALL myp5 ('费渡', @name, @`value`) $ 
SELECT 
  @name,
  @`value` $ 

带INOUT模式参数的存储过程

  • 传入两个值,得到两个值的二倍
-- 创建
CREATE PROCEDURE myp6 (INOUT a INT, INOUT b INT) 
BEGIN

SET a = a * 2 ;
SET b = b * 2 ;
 
END $ 
-- 调用
SET @a = 3 $
SET @b = 4 $
CALL myp6 (@a, @b) $
SELECT 
  @a,
  @b $ 

5. 其他操作

删除存储过程

-- 不支持一次删除多个
DROP PROCEDURE myp1 ;

查看存储过程的信息

SHOW CREATE PROCEDURE myp2 ;
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。