MySQL 存储过程基础

MySQLBeginner
立即练习

介绍

在本实验中,你将学习 MySQL 存储过程的基础知识。目标是了解如何创建、调用和修改存储过程来管理 MySQL 数据库中的数据。

你将首先创建一个名为 employees 的数据库和表。然后,你将编写一个名为 insert_employee 的存储过程来向 employees 表插入数据。你将学习如何使用 CALL 语句调用此过程,以及如何为过程添加输入参数。最后,你将学习如何使用 DROP PROCEDURE 语句删除该过程。

注意: 对于本次实验,你只需要在开始时进入一次 MySQL shell,并在最后退出。后续步骤中的所有 SQL 命令都应在同一个 MySQL 会话中执行。无需在步骤之间重复连接或断开 MySQL 连接。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 92%。获得了学习者 100% 的好评率。

创建用于插入数据的过程

在本步骤中,你将学习如何在 MySQL 中创建存储过程来向表中插入数据。存储过程是存储在数据库中的预编译 SQL 语句。它们可以通过名称执行,这可以提高性能和安全性。

首先,打开你的终端并使用以下命令连接到 MySQL 服务器:

sudo mysql -u root

此命令以 root 用户身份连接到 MySQL 服务器。请保持此 MySQL 会话打开以进行所有后续步骤。

连接成功后,你将进入 MySQL shell。现在,切换到设置过程中创建的 testdb 数据库:

USE testdb;

既然我们已经进入了正确的数据库,现在让我们创建一个存储过程来向 employees 表插入数据。存储过程使用 CREATE PROCEDURE 语句创建。我们将定义一个名为 insert_employee 的过程来插入一条新的员工记录。

以下是存储过程的 SQL 代码:

DELIMITER //
CREATE PROCEDURE insert_employee (IN employee_name VARCHAR(255), IN employee_department VARCHAR(255))
BEGIN
    INSERT INTO employees (name, department) VALUES (employee_name, employee_department);
END //
DELIMITER ;

让我们分解一下这段代码:

  • DELIMITER //: 这将语句分隔符从 ; 改为 //。这是必需的,因为过程本身包含分号,我们需要告诉 MySQL 将整个过程定义视为一个单独的语句。
  • CREATE PROCEDURE insert_employee: 这声明了创建一个名为 insert_employee 的存储过程。
  • (IN employee_name VARCHAR(255), IN employee_department VARCHAR(255)): 这定义了过程的输入参数。employee_nameemployee_department 是参数的名称,而 VARCHAR(255) 是它们的数据类型。IN 关键字表示这些是输入参数。
  • BEGIN ... END: 这个块包含调用过程时将执行的 SQL 语句。
  • INSERT INTO employees (name, department) VALUES (employee_name, employee_department);: 这是将新行插入 employees 表的 SQL 语句,使用了作为输入参数传递的值。
  • DELIMITER ;: 这会将语句分隔符重置回 ;

要执行此代码,请将其直接复制并粘贴到你的 MySQL shell 中。

执行代码后,你可以通过在 MySQL shell 中运行以下命令来验证过程是否已创建:

SHOW PROCEDURE STATUS WHERE db = 'testdb' AND name = 'insert_employee';

此命令将显示有关 insert_employee 过程的信息,包括其名称、数据库和创建日期。

你现在已成功创建了一个用于向 employees 表插入数据的存储过程。在下一步中,你将学习如何调用此过程。

使用 CALL 语句调用过程

在上一步中,你创建了一个名为 insert_employee 的存储过程。在本步骤中,你将学习如何使用 CALL 语句调用此过程。

提醒: 你应该仍然处于 MySQL shell 中并使用 testdb 数据库。如果不是,请使用以下命令切换到它:

USE testdb;

CALL 语句用于执行存储过程。语法如下:

CALL procedure_name(argument1, argument2, ...);

在我们的例子中,过程名称是 insert_employee,它接受两个参数:员工姓名和员工部门。

让我们调用 insert_employee 过程来插入一个名为“Alice Smith”,部门为“Engineering”的新员工:

CALL insert_employee('Alice Smith', 'Engineering');

此语句将使用指定的参数执行 insert_employee 过程。

要验证数据是否已正确插入,你可以在 MySQL shell 中查询 employees 表:

SELECT * FROM employees;

你应该会在表中看到一个新行,名为“Alice Smith”,部门为“Engineering”。id 将被自动分配。

让我们再插入一名员工,“Bob Johnson”,部门为“Marketing”:

CALL insert_employee('Bob Johnson', 'Marketing');

再次,通过查询 employees 表来验证插入:

SELECT * FROM employees;

现在你应该在表中看到两行,一行是“Alice Smith”,另一行是“Bob Johnson”。

你现在已经成功使用 CALL 语句调用了存储过程 insert_employee,并验证了数据已正确插入。这演示了如何使用存储过程来封装和重用 SQL 逻辑。

为过程添加输入参数

在前面的步骤中,你创建并调用了一个名为 insert_employee 的存储过程,该过程接受两个输入参数:employee_nameemployee_department。在本步骤中,你将学习如何向该过程添加另一个输入参数。

让我们向 insert_employee 过程添加一个 employee_salary 参数。这将允许我们在插入新记录时指定员工的薪资。

首先,你需要删除现有的过程。如果不删除它,尝试创建同名过程时会收到错误。在你的 MySQL shell 中,运行:

DROP PROCEDURE IF EXISTS insert_employee;

现在,让我们创建带有新输入参数的修改后的存储过程。

DELIMITER //
CREATE PROCEDURE insert_employee (IN employee_name VARCHAR(255), IN employee_department VARCHAR(255), IN employee_salary DECIMAL(10, 2))
BEGIN
    INSERT INTO employees (name, department, salary) VALUES (employee_name, employee_department, employee_salary);
END //
DELIMITER ;

让我们分解一下这些更改:

  • 我们在过程定义中添加了一个新的输入参数 IN employee_salary DECIMAL(10, 2)DECIMAL(10, 2) 是薪资的数据类型,它允许最多 10 位数字,其中包含 2 位小数。
  • 我们修改了 INSERT 语句以包含 salary 列和 employee_salary 参数。

现在,让我们调用修改后的 insert_employee 过程,以插入一个名为“Charlie Brown”,部门为“Finance”,薪资为 60000.00 的新员工:

CALL insert_employee('Charlie Brown', 'Finance', 60000.00);

要验证数据是否已正确插入,你可以在 MySQL shell 中查询 employees 表:

SELECT * FROM employees;

你应该会在表中看到一个新行,名为“Charlie Brown”,部门为“Finance”,薪资为 60000.00。

你现在已经成功地向存储过程 insert_employee 添加了一个输入参数,并验证了数据已正确插入。这演示了如何修改存储过程以适应新的需求。

删除过程

在最后一步中,你将学习如何从数据库中删除(移除)一个存储过程。删除过程会将其从数据库中移除,使其不再可用。

提醒: 你应该仍然处于 MySQL shell 中并使用 testdb 数据库。

DROP PROCEDURE 语句用于移除存储过程。语法如下:

DROP PROCEDURE [IF EXISTS] procedure_name;

IF EXISTS 子句是可选的,但推荐使用。如果过程不存在,它将防止错误发生。

在我们的例子中,过程名称是 insert_employee。让我们删除该过程:

DROP PROCEDURE IF EXISTS insert_employee;

此语句将从 testdb 数据库中移除 insert_employee 过程。

要验证过程是否已被删除,你可以在 MySQL shell 中再次尝试显示过程状态:

SHOW PROCEDURE STATUS WHERE db = 'testdb' AND name = 'insert_employee';

此命令应返回一个空结果集,表明该过程不再存在。

或者,如果你尝试调用该过程,你将收到一个错误:

CALL insert_employee('Test', 'Test', 1000);

这将导致类似以下的错误消息:ERROR 1305 (42000): PROCEDURE testdb.insert_employee does not exist

你现在已经成功删除了存储过程 insert_employee

现在你可以通过输入以下命令退出 MySQL shell:

exit

这标志着关于在 MySQL 中创建、调用、修改和删除存储过程的实验练习结束。

总结

在本实验中,你学习了 MySQL 存储过程的基础知识,包括创建名为 employees 的数据库和表。然后,你使用 CREATE PROCEDURE 语句定义了一个名为 insert_employee 的存储过程,该过程将数据插入到 employees 表中。DELIMITER 命令用于处理过程定义中的分号。

本实验还涵盖了如何为存储过程定义输入参数,指定它们的名称和数据类型。这使得你可以在调用过程时向其传递值,使其更加灵活和可重用。你练习了使用 CALL 语句调用存储过程并验证了数据插入。最后,你学习了如何使用 DROP PROCEDURE 语句删除存储过程。