14
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【MySQL】トランザクションを要するストアドプロシージャのテンプレート

Last updated at Posted at 2018-01-25

MySQLにおいて、トランザクションが必要なストアドプロシージャを書く必要があったので、その雛形を書き留めておきます。ちょっと苦労したのは、DECLARE EXIT HANDLERして明示的にROLLBACKしておかないと、途中でエラーがあってもCOMMITまでズンズン進んでしまうということでした。

  • MySQL 5.6.4以降
DELIMITER //
CREATE PROCEDURE プロシージャ名()
BEGIN
  -- DECLARE 変数

  -- DECLARE CURSOR

  DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
  BEGIN
    GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT;
    SELECT @sqlstate, @errno, @text;
    ROLLBACK;
  END;
  -- DECLARE 追加のHANDLER

  START TRANSACTION;
  
  -- ここに処理を書く
      
  COMMIT;
  SELECT 'Success!' AS result FROM DUAL;
END//
DELIMITER ;

CALL プロシージャ名();

エラーがあった場合はGET DIAGNOSTICS CONDITION 1により、エラー内容をSELECT文で表示するようにしています。これがないとROLLBACKして正常終了するだけで、どんなエラーが発生したのか分からないので。

またDECLAREの順序には決まりがあるみたいで、変数→カーソル→ハンドラーの順に並んでいないとエラーになります。

参考

14
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?