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 的过程中使用参数。
相关文章
如何在 MySQL 中声明和使用变量
发布时间:2024/03/26 浏览次数:115 分类:MySQL
-
当你需要在 MySQL 中的脚本中存储单个值时,最好的方法是使用变量。变量有不同的种类,有必要知道何时以及如何使用每种类型。
在 MySQL 中使用 Mysqladmin 刷新主机解除阻塞
发布时间:2024/03/26 浏览次数:82 分类:MySQL
-
你将了解阻止主机的原因。此外,通过使用 phpMyAdmin 和命令提示符刷新主机缓存来解除阻塞的不同方法和效果。