迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 数据库 > MySQL >

MySQL 带参数的存储过程

作者:迹忆客 最近更新:2023/05/06 浏览次数:

本篇文章介绍了 MySQL 存储过程,并演示了如何创建带参数和不带参数的存储过程。


带参数的 MySQL 存储过程

存储过程是您定义用于执行特定任务的子程序或代码块; 它们类似于其他编程语言中的函数。

这些过程存储在关系数据库中,可以多次调用和使用。 您必须在创建存储过程时指定一个名称。

此外,您还可以为其提供参数。 下面是创建 MySQL 存储过程的语法。

创建 MySQL 存储过程的语法

CREATE
    [DEFINER = user]
    PROCEDURE [IF  NOT  EXISTS] procedure_name  ([procedure_parameters[,...]])
    [characteristic  ...]  routine_body
    procedure_parameters: [ IN | OUT | INOUT ] parameters_name type
    type : _Any valid MySQL _data type
    characteristic: {
    COMMENT  '_string_'
    | LANGUAGE  SQL
    | [NOT] DETERMINISTIC
    | { CONTAINS SQL | NO SQL | READS SQL  DATA | MODIFIES SQL  DATA }
    | SQL SECURITY { DEFINER | INVOKER }
    }
routine_body: Valid SQL routine statement

如果你觉得上面的语法难以理解,你可以参考下面给出的上面语法的简单版本。

DELIMITER {custom delimiter}
CREATE PROCEDURE procedure_name([IN | OUT | INOUT] param_1 [DATATYPE], ...)
BEGIN
// Your Code
END;
{custom delimiter}

调用 MySQL 存储过程

我们可以使用以下命令在创建后调用 MySQL 存储过程。

call procedure_name(param_1, param2,...);

在 MySQL 中创建存储过程时,请牢记以下几点:

  1. 使用 CREATE PROCEDURE 命令创建一个 MySQL 存储过程,后跟过程名。 过程名称不区分大小写,这意味着 new_proc 和 NEW_PROC 是相同的。
  2. 一个数据库不能有两个同名的过程。
  3. 过程的名称可以分隔。 如果名称被分隔,则允许使用空格。
  4. 过程名称不得超过 64 个字符。
  5. 不要使用 MySQL 的默认内置函数名称作为过程名称; 否则会导致错误。
  6. 一对圆括号 () 构成了 CREATE PROCEDURE 的最后一个组成部分。 括号包含参数; 如果没有参数,则使用空括号。
  7. 下一部分是编写语句的地方。
  8. 将参数指定为 OUT、IN 或 INOUT,这仅对过程有效。 如果你想传递参数,我们必须遵循这一步。

MySQL存储过程中的IN参数

IN 参数将值传递给存储过程。

DELIMITER //
CREATE PROCEDURE simple_addition (IN param_1 INT, IN param_2 INT)
BEGIN
    SELECT param_1 + param_2;
END //
DELIMITER ;

CALL simple_addition(2,4); #produces 6 as output

输出:

param_1 + param_2
6

MySQL存储过程中的OUT参数

我们可以在存储过程中更新 OUT 参数的值,该值将进一步传递回调用程序。

DELIMITER //
CREATE PROCEDURE simple_addition (IN param_1 INT, IN param_2 INT, OUT param_3 INT)
BEGIN
    SET param_3 = param_1 + param_2;
END //
DELIMITER ;

CALL simple_addition(2,4, @output_var);
SELECT @output_var;

输出:

@output_var
6

MySQL存储过程中的 INOUT 参数

INOUT 参数结合了 IN 和 OUT 参数。 调用程序可以传递一个参数,该参数可以由存储过程修改并将新值返回给调用程序。

DELIMITER //
CREATE PROCEDURE counter(INOUT set_counter INT, IN increment INT)
BEGIN
    SET set_counter = set_counter + increment;
END //
DELIMITER ;

SET @counter = 1;
CALL counter(@counter,2); -- 3
CALL counter(@counter,5); -- 8
SELECT @counter; -- 8

输出:

@counter
8

在这里,我们使用 increment 作为输入参数,而 set_counter 是输入和输出参数。

MySQL存储过程的特点

MySQL 允许您描述正在创建的过程的特征。

characteristic: {
    COMMENT  '_string_'
    | LANGUAGE  SQL
    | [NOT] DETERMINISTIC
    | { CONTAINS SQL | NO SQL | READS SQL  DATA | MODIFIES SQL  DATA }
    | SQL SECURITY { DEFINER | INVOKER }
    }

这些特征后跟括号,前面是 BEGIN 子句。 但是,这些特征是可选的; 您不必每次都显式地编写这些代码行。

特征 说明
COMMENT 用于描述存储例程; 所有详细信息都由 SHOW CREATE PROCEDURE 语句显示。
LANGUAGE 它表示过程的主体是用 SQL 编写的。
[NOT] DETERMINISTIC 如果例程对于相同的输入参数始终产生相同的结果,则该例程被认为是确定性的,如果不是,则不是确定性的。
CONTAINS SQL 表示例程中不包含任何读写数据的语句。
NO SQL 它表示过程中不存在任何 NO SQL 语句。
READS SQL DATA 该过程仅包含读取数据的语句,例如 SELECT 命令。
MODIFIES SQL DATA 程序包含可以将数据写入 MODIFIES SQL DATA 的语句(例如,INSERT 或 DELETE)。
`SQL SECURITY {DEFINER INVOKER}`

以上特征子句取值均为默认值。 例如,以下两个存储过程产生相同的输出。

DELIMITER //
CREATE PROCEDURE procedure_name ()
BEGIN
    SELECT CURRENT_DATE();
END //
DELIMITER ;

call procedure_name(); -- 2022-09-05

上面的代码与明确提及特征时的代码相同。

DELIMITER //
CREATE PROCEDURE procedure_name ()
COMMENT ''
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
BEGIN
    SELECT CURRENT_DATE();
END //
DELIMITER ;

call procedure_name(); -- 2022-09-05

所以,我们已经学习了如何在 MySQL 的过程中使用参数。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

如何在 MySQL 中声明和使用变量

发布时间:2024/03/26 浏览次数:115 分类:MySQL

当你需要在 MySQL 中的脚本中存储单个值时,最好的方法是使用变量。变量有不同的种类,有必要知道何时以及如何使用每种类型。

在 MySQL 中实现刷新权限

发布时间:2024/03/26 浏览次数:211 分类:MySQL

本教程介绍了 MySQL 中的刷新权限命令,用于刷新授权表并影响允许的更改。

在 MySQL 中设置时区

发布时间:2024/03/26 浏览次数:93 分类:MySQL

在本教程中,我们将学习如何在 MySQL 服务器中更改时区。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便