例外処理( 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