MySQL 带参数的存储过程
本篇文章介绍了 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 中创建存储过程时,请牢记以下几点:
- 使用 CREATE PROCEDURE 命令创建一个 MySQL 存储过程,后跟过程名。 过程名称不区分大小写,这意味着 new_proc 和 NEW_PROC 是相同的。
- 一个数据库不能有两个同名的过程。
- 过程的名称可以分隔。 如果名称被分隔,则允许使用空格。
- 过程名称不得超过 64 个字符。
- 不要使用 MySQL 的默认内置函数名称作为过程名称; 否则会导致错误。
- 一对圆括号 () 构成了 CREATE PROCEDURE 的最后一个组成部分。 括号包含参数; 如果没有参数,则使用空括号。
- 下一部分是编写语句的地方。
- 将参数指定为 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 的过程中使用参数。
相关文章
使用 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() 的组合。
使用 Ubuntu 连接远程 MySQL 服务器的不同方法
发布时间:2023/05/09 浏览次数:97 分类:MySQL
-
在本文中我们将学习如何使用 Ubuntu 连接远程 MySQL 服务器来操作数据以及启动和停止 MySQL 服务器。
在 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)。