介绍
在本实验中,你将学习 MySQL 存储过程的基础知识。目标是了解如何创建、调用和修改存储过程来管理 MySQL 数据库中的数据。
你将首先创建一个名为 employees 的数据库和表。然后,你将编写一个名为 insert_employee 的存储过程来向 employees 表插入数据。你将学习如何使用 CALL 语句调用此过程,以及如何为过程添加输入参数。最后,你将学习如何使用 DROP PROCEDURE 语句删除该过程。
注意: 对于本次实验,你只需要在开始时进入一次 MySQL shell,并在最后退出。后续步骤中的所有 SQL 命令都应在同一个 MySQL 会话中执行。无需在步骤之间重复连接或断开 MySQL 连接。
创建用于插入数据的过程
在本步骤中,你将学习如何在 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_name和employee_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_name 和 employee_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 语句删除存储过程。



