Skip to content

MySQL存储过程与函数详解

Published:  at  04:31 AM

存储过程与函数

在 MySQL 中,存储过程(Procedure)和函数(Function) 都属于数据库的可编程对象,作用类似于 Java 中的方法,用于封装一组 SQL 逻辑。


一、存储过程概述

1. 什么是存储过程

存储过程 是一组 预先编译并存储在数据库中的 SQL 语句集合,可以通过名称反复调用。


2. 使用存储过程的好处


二、存储过程的创建与调用

1. 基本语法

CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
    存储过程体
END;

2. 参数说明

参数列表由三部分组成:

参数模式 参数名 参数类型

参数模式包括:


3. 注意事项

  1. 存储过程体中每条 SQL 语句必须以分号结尾
  2. 如果存储过程体只有一条语句,可省略 BEGIN ... END
  3. 创建存储过程时通常需要修改语句结束符
DELIMITER $

4. 调用语法

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

三、存储过程示例

1. 无参存储过程

示例:向 admin 表中插入多条数据

DROP TABLE IF EXISTS admin;
CREATE TABLE admin(
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(20),
    password VARCHAR(15)
);

DELIMITER $
CREATE PROCEDURE p1()
BEGIN
    INSERT INTO admin
    VALUES
        (NULL,'Leslie','0000'),
        (NULL,'JJ','0111'),
        (NULL,'Lily','0011');
END $
DELIMITER ;

CALL p1();

2. 带 IN 参数的存储过程

示例:根据女生姓名查询男友信息

USE girls;

CREATE PROCEDURE p2(IN girlName VARCHAR(20))
BEGIN
    SELECT bo.*
    FROM boys bo
    INNER JOIN beauty b ON bo.id = b.boyfriend_id
    WHERE b.name = girlName;
END;

CALL p2('小昭');

3. 带逻辑判断的存储过程

示例:模拟用户登录校验

CREATE PROCEDURE p3(IN uname VARCHAR(20), IN pwd VARCHAR(20))
BEGIN
    DECLARE result INT DEFAULT 0;

    SELECT COUNT(*) INTO result
    FROM admin
    WHERE username = uname AND password = pwd;

    SELECT IF(result > 0, '成功', '失败') AS 登录结果;
END;

CALL p3('john','8888');

4. 带 OUT 参数的存储过程

示例:根据女生名返回男生名

CREATE PROCEDURE p4(IN girlName VARCHAR(20), OUT boyName VARCHAR(20))
BEGIN
    SELECT bo.boyName INTO boyName
    FROM boys bo
    INNER JOIN beauty b ON bo.id = b.boyfriend_id
    WHERE b.name = girlName;
END;

CALL p4('小昭', @boyName);
SELECT @boyName;

5. 多个 OUT 参数

CREATE PROCEDURE p5(
    IN girlName VARCHAR(20),
    OUT boyName VARCHAR(20),
    OUT boyCP INT
)
BEGIN
    SELECT bo.boyName, bo.userCP
    INTO boyName, boyCP
    FROM boys bo
    INNER JOIN beauty b ON bo.id = b.boyfriend_id
    WHERE b.name = girlName;
END;

CALL p5('小昭', @boyName, @boyCP);
SELECT @boyName, @boyCP;

6. INOUT 参数示例

CREATE PROCEDURE p6(INOUT a INT, INOUT b INT)
BEGIN
    SET a = a * 2;
    SET b = b * 2;
END;

SET @aNum = 10;
SET @bNum = 6;
CALL p6(@aNum, @bNum);
SELECT @aNum, @bNum;

7. 管理存储过程

-- 查看存储过程
SHOW CREATE PROCEDURE p3;

-- 删除存储过程
DROP PROCEDURE p2;

实际开发中,存储过程一般 不频繁修改


四、函数(Function)

1. 存储过程与函数的区别

对比项存储过程函数
返回值0 个或多个(OUT)有且仅有 1 个
调用方式CALLSELECT
使用场景批量操作、复杂逻辑计算并返回单一结果

2. 创建函数语法

CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
BEGIN
    函数体
END;

说明:


3. 调用函数

SELECT 函数名(参数列表);

五、函数示例

1. 无参有返回值函数

示例:返回员工总数

USE myemployees;

CREATE FUNCTION f1() RETURNS INT
BEGIN
    DECLARE c INT;
    SELECT COUNT(*) INTO c FROM employees;
    RETURN c;
END;

SELECT f1() AS result;

2. 带参函数

示例:根据员工姓名返回工资

CREATE FUNCTION f2(username VARCHAR(20)) RETURNS INT
BEGIN
    DECLARE s INT;
    SELECT salary INTO s
    FROM employees
    WHERE last_name = username;
    RETURN s;
END;

SELECT f2('Chen') AS salary;

3. 管理函数

-- 查看函数
SHOW CREATE FUNCTION f1;

-- 删除函数
DROP FUNCTION f1;

六、小结


Suggest Changes

Previous Post
MySQL流程控制中的分支与循环结构详解
Next Post
MySQL变量详解与使用指南