迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 数据库 > 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 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

使用 Mysqldump 备份 MySQL 中的数据

发布时间:2023/05/09 浏览次数:192 分类:MySQL

本篇文章将介绍如何使用 mysqldump 只备份数据。 在这里,我们将探讨 --no-create-info 、--compact 、--skip-triggers 和 --no-create-db 选项。

更新 MySQL 表中的主键

发布时间:2023/05/09 浏览次数:61 分类:MySQL

本篇文章介绍如何更新 MySQL 表中的主键。 我们将使用 ALTER 命令对主键进行任何更改。更新 MySQL 表中的主键 我们可以在多种情况下更新 MySQL 表中的主键。

在 MySQL 中获取命令历史记录

发布时间:2023/05/09 浏览次数:150 分类:MySQL

本文重点介绍了在 Windows 和 Linux 中获取我们已执行的 MySQL 命令历史记录的各种方法。MySQL命令历史

Oracle 的 decode 函数在 MySQL 中的等价物

发布时间:2023/05/09 浏览次数:115 分类:MySQL

本篇文章介绍了三种替代实现,我们可以将它们用作 MySQL 中 Oracle 的 decode() 函数的等价物。 为此,我们将使用 IF()、CASE 以及 FIELD() 和 ELT() 的组合。

在 Linux 中安装 MySQL 客户端

发布时间:2023/05/09 浏览次数:72 分类:MySQL

在 Linux 中安装 MySQL 客户端的命令。Linux 和 Unix 等环境作为命令行界面工作,仅在命令的帮助下运行。

在 MySQL 中转换为十进制

发布时间:2023/05/09 浏览次数:150 分类:MySQL

有时,我们可能需要将一种数据类型转换为另一种数据类型。 下面是我们如何使用带有 DECIMAL(M,D) 的 CAST() 和 CONVERT() 函数在 MySQL 中转换为十进制。

在 MySQL 中获取当前日期和时间

发布时间:2023/05/09 浏览次数:145 分类:MySQL

本篇文章我们将学习 NOW()、CURRENT_TIMESTAMP()(也写为 CURRENT_TIMESTAMP)和 SYSDATE() 来获取 MySQL 中的当前日期和时间。 我们还将看到这三个功能之间的比较。在 MySQL 中获取当前日期和时间

更改 MySQL 服务器中的 max_allowed_packet Size

发布时间:2023/05/09 浏览次数:142 分类:MySQL

本篇文章介绍如何更改 MySQL 服务器中的 max_allowed_packet 大小。 为了了解这一点,我们将使用两个操作系统,Windows 10 和 Linux (Ubuntu)。

扫一扫阅读全部技术教程

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

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便