MySQL 存储过程中传入参数的默认值设置

在MySQL中,存储过程是一组预编译的SQL语句集合,可以在数据库中创建并以名称进行调用。存储过程允许我们封装和重用复杂的数据库操作,同时还可以提高性能。

当我们在存储过程中定义参数时,有时候需要给参数设置一个默认值,以便在调用存储过程时,如果没有显式地传入该参数,那么就使用默认值。

本文将介绍如何在MySQL存储过程中给传入参数设置默认值。

1. 存储过程参数的定义

在MySQL存储过程中,我们通过INOUTINOUT关键字来定义存储过程的参数。

  • IN参数是只读的,用于存储过程内部使用。它们允许我们在存储过程内部读取它们的值,但不能在存储过程中修改它们的值。
  • OUT参数是只写的,用于存储过程向外部传递值。它们允许我们在存储过程内部修改它们的值,并将其作为结果返回给调用者。
  • INOUT参数是可读可写的,既可以在存储过程内部读取它们的值,也可以在存储过程中修改它们的值,并将其作为结果返回给调用者。

以下是一个示例存储过程,它接收两个参数,一个是IN类型的参数name,另一个是OUT类型的参数age

CREATE PROCEDURE getAgeByName(IN name VARCHAR(100), OUT age INT)
BEGIN
    SELECT age INTO age FROM users WHERE name = name;
END

2. 参数默认值的设置

在MySQL中,我们可以使用DEFAULT关键字为存储过程参数设置默认值。当调用存储过程时,如果没有为该参数显式传入值,那么就使用默认值。

以下是一个示例存储过程,它接收一个IN类型的参数name和一个具有默认值的IN类型的参数status

CREATE PROCEDURE getUserStatus(IN name VARCHAR(100), IN status VARCHAR(20) DEFAULT 'active')
BEGIN
    SELECT * FROM users WHERE name = name AND user_status = status;
END

在上面的示例中,如果调用存储过程时没有传入status参数的值,那么status参数将使用默认值'active'

3. 示例应用

为了更好地理解存储过程参数默认值的设置,我们将创建一个示例应用来演示它的用法。

假设我们有一个users表,包含以下字段:

  • id:用户ID
  • name:用户名
  • email:用户邮箱
  • user_status:用户状态(activeinactive

我们希望创建一个存储过程,它接收一个用户名作为参数,并根据用户状态返回符合条件的用户记录。如果没有传入用户状态参数,那么就返回所有状态的用户记录。

首先,我们需要创建一个存储过程,如下所示:

CREATE PROCEDURE getUsersByName(IN name VARCHAR(100), IN status VARCHAR(20) DEFAULT NULL)
BEGIN
    IF status IS NULL THEN
        SELECT * FROM users WHERE name = name;
    ELSE
        SELECT * FROM users WHERE name = name AND user_status = status;
    END IF;
END

在上面的示例中,我们使用了IF语句来判断是否传入了用户状态参数。如果传入了参数,则使用传入的参数值来筛选符合条件的用户记录;如果没有传入参数,则返回所有状态的用户记录。

下面是一个使用该存储过程的示例:

CALL getUsersByName('John'); -- 返回所有名字为'John'的用户记录
CALL getUsersByName('John', 'active'); -- 返回名字为'John'且状态为'active'的用户记录
CALL getUsersByName('John', 'inactive'); -- 返回名字为'John'且状态为'inactive'的用户记录

在上面的示例中,第一个调用没有传入用户状态参数,因此返回所有名字为'John'