例外処理(DECLARE ... HANDLER)

ストアドプロシージャ内での例外処理には、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
[an error occurred while processing this directive]