MySQL 5.1 リファレンスマニュアル :: 17 ストアドプロシージャとファンクション :: 17.2 ストアドルーチン構文 :: 17.2.8 条件とハンドラ :: 17.2.8.2 DECLARE ハンドラ
« 17.2.8.1 DECLARE 条件

17.2.9 カーソル »
Section Navigation      [Toggle]
  • 17.2.8 条件とハンドラ
  • 17.2.8.1 DECLARE 条件
  • 17.2.8.2 DECLARE ハンドラ

17.2.8.2. DECLARE ハンドラ

DECLARE handler_type HANDLER FOR condition_value[,...] statement

handler_type:
    CONTINUE
  | EXIT
  | UNDO

condition_value:
    SQLSTATE [VALUE] sqlstate_value
  | condition_name
  | SQLWARNING
  | NOT FOUND
  | SQLEXCEPTION
  | mysql_error_code

DECLARE ... HANDLERステートメントは各々が複数の条件で処理することができるハンドラを規定します。もし、これらの条件の1つが起った場合、ステートメントが実行されます。この場合、ステートメントを単純なものにすることができます。 (例えば、 SET var_name = value), もしくは、BEGIN と END を使って書いた複合ステートメントにすることができます。(項17.2.5. 「BEGIN ... END 複合ステートメント構文」参照)

CONTINUEハンドラに対して、現ルーチンの実行が、ハンドラステートメントの実行の後に続きます。EXIT ハンドラに関しては、ハンドラが宣言された BEGIN ... END コンパウンドステートメントの中で実行が終了します。(これは、条件が内側にあるブロックの中に発生する場合でも同じです。)UNDO ハンドラタイプのステートメントはまだサポートされていません。

ハンドラがまだ宣言されていない条件がしている場合、デフォルトアクションはEXITとなります。

A condition_valueは以下の値のいずれかにすることができます:

  • SQLSTATE値もしくはMySQLエラーコード。

  • 既に DECLARE ... CONDITIONで指定されている条件名。項17.2.8.1. 「DECLARE 条件」 を参照してください。

  • SQLWARNINGは01で始まる全てのSQLSTATEコードに対する速記文字です。

  • NOT FOUNDは02で始まる全てのSQLSTATEコードに対する速記文字です。

  • SQLEXCEPTIONはSQLWARNINGまたはNOT FOUNDによって捕らえられなかった全てのSQLSTATEコードの速記文字です。

例:

mysql> CREATE TABLE test.t (s1 int,primary key (s1));
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter //

mysql> CREATE PROCEDURE handlerdemo ()
    -> BEGIN
    ->   DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1;
    ->   SET @x = 1;
    ->   INSERT INTO test.t VALUES (1);
    ->   SET @x = 2;
    ->   INSERT INTO test.t VALUES (1);
    ->   SET @x = 3;
    -> END;
    -> //
Query OK, 0 rows affected (0.00 sec)

mysql> CALL handlerdemo()//
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @x//
    +------+
    | @x   |
    +------+
    | 3    |
    +------+
    1 row in set (0.00 sec)

その例は、重複キーエラーに対して発生するSQLSTATE 23000を持つハンドラに関連するものです。@x は 3です。 MySQLがプロシージャの最後まで実行されたことを示しています。もしDECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1;ラインが存在していなかった場合、 MySQLは(EXIT) のデフォルトパスを、2番目のINSERTがPRIMARY KEY制限によって失敗したとき取り、そしてSELECT @x は2を返しています。

条件を無視したい場合、ユーザはそれに対して、CONTINUEハンドラと宣言して、それを空のブロックと関連させることができます。例:

DECLARE CONTINUE HANDLER FOR SQLWARNING BEGIN END;
Copyright © 1997, 2010, Oracle and/or its affiliates. All rights reserved. Legal Notices
Top / Previous / Next / Up / Table of Contents
© 2010, Oracle Corporation and/or its affiliates