MySqlエラー処理(二)-Condition&Handle


20.2.10.条件とハンドラ
20.2.10.1. DECLARE条件
20.2.10.2. DECLAREプロセッサ
特定の条件には特定の処理が必要です.これらの条件は、エラー、およびサブルーチンの一般的なプロセス制御に関連付けることができます.
20.2.10.1.DECLARE条件
DECLARE condition_name CONDITION FOR condition_value
 
condition_value:
    SQLSTATE [VALUE] sqlstate_value
 | mysql_error_code

この文は、特別な処理が必要な条件を指定します.名前と指定したエラー条件を関連付けます.この名前は、その後DECLARE HANDLER文で使用できます.20.2.10.2節、「DECLAREプロセッサ」を参照してください.
SQLSTATE値に加え、MySQLエラーコードもサポートされています.
20.2.10.2.DECLAREプロセッサ
DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
 
handler_type:
    CONTINUE
 | EXIT
 | UNDO
 
condition_value:
    SQLSTATE [VALUE] sqlstate_value
 | condition_name
 | SQLWARNING
 | NOT FOUND
 | SQLEXCEPTION
 | mysql_error_code

この文は、1つ以上の条件を処理できるプロセッサを指定します.1つ以上の条件が生成されると、指定された文が実行されます.
CONTINUEプロセッサの場合、現在のサブルーチンの実行は、プロセッサ文の実行後に続行されます.EXITプロセッサの場合、現在のBEGIN...END複合文の実行が終了します.UNDOハンドラタイプ文はサポートされていません.
・SQLWARNINGは、01で始まるすべてのSQLSTATEコードの速記である.
・NOT FOUNDは、02で始まるすべてのSQLSTATEコードの速記である.
・SQLEXCEPTIONは、SQLWARNINGまたはNOT FOUNDによってキャプチャされていないすべてのSQLSTATEコードの速記である.
SQLSTATE値に加え、MySQLエラーコードもサポートされていません.
例:
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)

なお,@xは3であり,これはMySQLがプログラムの最後に実行されたことを示す.DECLARE CONTINUTE HANDLER FOR SQLSTATE'23000'SET@x 2=1の場合.この行はありません.2番目のINSERTがPRIMARY KEY強制に失敗した後、MySQLはデフォルト(EXIT)パスを取った可能性があり、SELECT@xは2を返した可能性があります.