MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

SQLSTATEを使ったMySQLハンドラーの書き方:ストアドプロシージャでエラー発生時に実行を終了する方法


MySQLのストアドプロシージャ内で例外が発生した場合、適切なエラーメッセージを投げて対処することが非常に重要です。例外をハンドリングせずに放置すると、その例外が原因でアプリケーション自体が失敗してしまう可能性があるためです。MySQLでは、デフォルトのMySQLエラーに対してSQLSTATEを利用し、実行を終了させるハンドラー(EXIT HANDLER)を提供しています。

以下の例では、主キー列に重複した値を挿入しようとしたケースを通じて、このハンドラーの動作を確認します。

EXIT HANDLERを使ったストアドプロシージャの作成例

mysql> DELIMITER //
mysql> CREATE PROCEDURE Insert_Studentdetails4(S_Studentid INT, S_StudentName VARCHAR(20), S_Address VARCHAR(20), OUT got_error INT)
    -> BEGIN
    -> DECLARE EXIT HANDLER FOR 1062 SET got_error = 1;
    -> INSERT INTO Student_detail
    -> (Studentid, StudentName, Address)
    -> VALUES(S_Studentid, S_StudentName, S_Address);
    -> SELECT * FROM Student_detail;
    -> END //
Query OK, 0 rows affected (0.00 sec)

このプロシージャでは、「DECLARE EXIT HANDLER FOR 1062 SET got_error = 1;」という宣言によって、MySQLエラー番号1062(主キーや一意制約における重複エラー)が発生した時点で変数got_errorに1を設定し、プロシージャの実行を即座に終了させます。

なお、エラー番号の代わりにSQLSTATEコードを直接指定することも可能です。エラー1062に対応するSQLSTATEは「23000」であるため、次のように記述しても同じ動作になります。

DECLARE EXIT HANDLER FOR SQLSTATE '23000' SET got_error = 1;

重複データ挿入時の動作確認

続いて、列「studentid」に重複した値を追加しようとしてみます。

mysql> DELIMITER ;
mysql> CALL Insert_Studentdetails4(104, 'Ram', 'Chandigarh', @got_error);

Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @got_error;
+------------+
| @got_error |
+------------+
|         1 |
+------------+
1 row in set (0.00 sec)

結果を見ると、重複した値を挿入しようとした時点で実行が終了していることがわかります。プロシージャ内に記述された「SELECT * FROM Student_detail」の結果セットは返されず、重複値の挿入に関するデフォルトのMySQLエラー(エラー番号1062)だけが通知されます。同時に、ハンドラーによって変数got_errorには1が設定されており、呼び出し元でエラーの発生有無を判定できるようになっています。

このようにEXIT HANDLERを活用することで、ストアドプロシージャ内で予期しないエラーが発生した場合でも、アプリケーション側へ適切な情報を返しながら、安全に処理を終了させることができます。

  1. MySQLのストアドプロシージャとSELECT文でIFを使い分ける方法を解説

    MySQLでは、ストアドプロシージャ内でIF文を使用できるだけでなく、SELECT文の中でもIF()関数を使うことができます。この2つは似た名前ですが、用途や書き方が異なります。それぞれの使い方を具体例とともに見ていきましょう。SELECT文でのIF()関数の使い方SELECT文で使えるIF()関数は、条件式が真の場合と偽の場合で返す値を切り替えられる便利な関数です。まず、条件が正しい(真になる)場合の例です。mysql> select if(0=0,Hello MySQL,condition is wrong);実行すると、次のような結果が出力されます。+---------------

  2. MySQLストアドプロシージャでDELIMITER(区切り文字)を正しく使って値を挿入する方法

    MySQLでストアドプロシージャを作成する際、DELIMITER(区切り文字)の扱いに戸惑う方は少なくありません。デフォルトではMySQLクライアントがセミコロン「;」を文の終端として解釈するため、プロシージャ内の複数のSQL文が途中で分割されてしまうことがあります。本記事では、区切り文字を正しく変更しながら、ストアドプロシージャを使ってテーブルへ値を挿入する具体的な手順を解説します。 1. サンプルテーブルを作成する まず、データを挿入するためのテーブルを作成します。ここでは学生の名前と姓を格納するテーブルを用意しました。 mysql> create table DemoTable