在存储过程中处理错误
存储过程可能因多种原因失败,例如尝试将重复数据插入主键列。使用错误处理程序可以让你捕获这些错误并优雅地响应,而不是让过程崩溃。在此步骤中,你将创建一个带有针对重复键错误的处理程序的存储过程。
首先,连接到 MySQL 服务器。
sudo mysql -u root
如果 testdb 数据库尚不存在,请创建它并切换到该数据库。然后,创建一个 products 表。
CREATE DATABASE IF NOT EXISTS testdb;
USE testdb;
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(255),
quantity INT
);
现在,创建一个存储过程来插入新产品。此版本包含一个 DECLARE HANDLER,它可以捕获重复键错误(SQLSTATE 23000)并返回自定义消息。
DELIMITER 命令将语句终止符从 ; 更改为 //,这使得过程体内的分号能够被正确处理。
DELIMITER //
CREATE PROCEDURE insert_product(IN p_id INT, IN p_name VARCHAR(255))
BEGIN
-- 声明一个 EXIT HANDLER 来处理重复键错误
DECLARE EXIT HANDLER FOR SQLSTATE '23000'
BEGIN
SELECT 'Error: Product with this ID already exists.' AS message;
END;
-- 尝试插入产品
INSERT INTO products (id, name, quantity) VALUES (p_id, p_name, 0);
SELECT 'Product inserted successfully.' AS message;
END //
DELIMITER ;
让我们测试一下这个过程。首先,插入一个新产品。
CALL insert_product(1, 'Laptop');
这应该会成功并返回成功消息。
+--------------------------------+
| message |
+--------------------------------+
| Product inserted successfully. |
+--------------------------------+
1 row in set (0.00 sec)
现在,尝试插入具有相同 id 的产品。
CALL insert_product(1, 'Desktop');
这次,错误处理程序被触发,你收到的是自定义错误消息,而不是通用的 MySQL 错误。
+-----------------------------------------------+
| message |
+-----------------------------------------------+
| Error: Product with this ID already exists. |
+-----------------------------------------------+
1 row in set (0.00 sec)
这演示了错误处理程序如何使你的存储过程更加用户友好和健壮。