ストアドプロシージャにエラーハンドリングを追加する
このステップでは、MySQL のストアドプロシージャにエラーハンドリングを追加します。エラーハンドリングは、ストアドプロシージャの堅牢性と信頼性を確保するために重要です。無効な入力、データベース接続エラー、またはデータ整合性違反などの予期しない状況を適切に処理することができます。
まず、エラーハンドリングを持たない単純なストアドプロシージャを作成しましょう。このプロシージャは、テーブルに新しいレコードを挿入しようとします。挿入が失敗した場合(たとえば、重複キーのため)、プロシージャはエラーに関する具体的な情報を提供せずに単に終了します。
root
ユーザーとして MySQL サーバーに接続します。
mysql -u root -p
次に、例のためにデータベースとテーブルを作成しましょう。
CREATE DATABASE IF NOT EXISTS testdb;
USE testdb;
CREATE TABLE IF NOT EXISTS products (
id INT PRIMARY KEY,
name VARCHAR(255)
);
次に、products
テーブルに新しい製品を挿入する insert_product
という名前のストアドプロシージャを作成します。
DELIMITER //
CREATE PROCEDURE insert_product(IN p_id INT, IN p_name VARCHAR(255))
BEGIN
INSERT INTO products (id, name) VALUES (p_id, p_name);
END //
DELIMITER ;
このストアドプロシージャは 2 つの入力パラメータを受け取ります。p_id
(製品 ID)と p_name
(製品名)です。そして、指定された値で products
テーブルに新しいレコードを挿入しようとします。
次に、ストアドプロシージャにエラーハンドリングを追加しましょう。特定のエラーが発生したときに実行されるエラーハンドラを定義するために、DECLARE ... HANDLER
構文を使用します。
insert_product
ストアドプロシージャを次のように変更します。
DELIMITER //
CREATE PROCEDURE insert_product(IN p_id INT, IN p_name VARCHAR(255))
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SELECT 'An error occurred during the insertion.' AS message;
END;
INSERT INTO products (id, name) VALUES (p_id, p_name);
END //
DELIMITER ;
この変更されたバージョンでは、DECLARE EXIT HANDLER FOR SQLEXCEPTION
を使用してエラーハンドラを追加しています。このハンドラは、ストアドプロシージャの実行中に SQL 例外が発生した場合に実行されます。ハンドラの中では、エラーが発生したことを示すメッセージを選択しています。
エラーハンドリング付きのストアドプロシージャをテストしましょう。まず、製品を挿入します。
CALL insert_product(1, 'Product A');
これにより、products
テーブルに新しいレコードがエラーなく挿入されるはずです。
次に、同じ製品を再度挿入してみましょう。
CALL insert_product(1, 'Product A');
今回は、id
列が主キーであり、重複値を含むことができないため、挿入は失敗します。しかし、単に終了する代わりに、エラーハンドラが実行され、「An error occurred during the insertion.」というメッセージが表示されます。
また、異なるタイプのエラーに対してより具体的なエラーハンドラを追加することもできます。たとえば、重複キーエラー(SQLSTATE '23000')に対するハンドラを追加することができます。
DELIMITER //
CREATE PROCEDURE insert_product(IN p_id INT, IN p_name VARCHAR(255))
BEGIN
DECLARE EXIT HANDLER FOR SQLSTATE '23000'
BEGIN
SELECT 'Duplicate key error.' AS message;
END;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SELECT 'An error occurred during the insertion.' AS message;
END;
INSERT INTO products (id, name) VALUES (p_id, p_name);
END //
DELIMITER ;
これで、重複する製品を挿入しようとすると、一般的なエラーメッセージではなく、「Duplicate key error.」というメッセージが表示されます。
この例は、MySQL のストアドプロシージャに基本的なエラーハンドリングを追加する方法を示しています。エラーハンドラを使用することで、ストアドプロシージャをより堅牢にし、ユーザーにより有益なエラーメッセージを提供することができます。