例外処理( DECLARE ... HANDLER )

メモ:  Category:mysql

ストアドプロシージャ内での例外処理には、 DECLARE … HANDLER を使用します。

SQL 文を実行した時のエラーなどを捕まえ、強制終了したり、何らかの処理を実行したりします。

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

handler_type には、次のうちいずれかを指定します。

  • CONTINUE:ハンドラを実行した後、実行制御を元の場所に戻します。
  • EXIT:ハンドラを実行した後、プログラムを終了します。
  • UNDO:まだサポートしていません。

condition_valueハンドラがキャッチする条件を指定します。条件は複数指定できます。

  • SQLSTATE [VALUE] sqlstate_value:特定のSQLSTATEをキャッチします。
  • condition_name:DECLARE … CONDITIONで宣言したコンディション名を指定します。
  • SQLWARNING:01で始まるSQLSTATEをキャッチします。
  • NOT FOUND:02 で始まるSQLStateをキャッチします。
  • SQLEXCEPTION:01, 02 以外で始まるSQLStateをキャッチします。
  • mysql_error_code:特定のMySQL固有エラーコードをキャッチします。

sp_statementに例外をキャッチしたときに実行するステートメント文を記述します。

DECLARE … CONDITION(条件の定義)

DECLARE condition名 CONDITION FOR condition_value 

condition_valueに条件を定義します。

  • SQLSTATE [VALUE] sqlstate_value:特定のSQLStateをキャッチします。
  • mysql_error_code:特定のMySQL固有エラーコードをキャッチします。

簡単な例外の例

CREATE PROCEDURE curdemo()
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE a,b INT;
  DECLARE cur1 CURSOR FOR SELECT price1,price2 FROM test.t1;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

  OPEN cur1;

  REPEAT
    FETCH cur1 INTO a, b;
    IF NOT done THEN
       IF a < b THEN
          INSERT INTO test.t3 VALUES (a,b);
       END IF;
    END IF;
  UNTIL done END REPEAT;

  CLOSE cur1;
END

bluenote by BBB