MySqlエラー処理(二)-Condition&Handle
4162 ワード
20.2.10.条件とハンドラ
20.2.10.1. DECLARE条件
20.2.10.2. DECLAREプロセッサ
特定の条件には特定の処理が必要です.これらの条件は、エラー、およびサブルーチンの一般的なプロセス制御に関連付けることができます.
20.2.10.1.DECLARE条件
この文は、特別な処理が必要な条件を指定します.名前と指定したエラー条件を関連付けます.この名前は、その後DECLARE HANDLER文で使用できます.20.2.10.2節、「DECLAREプロセッサ」を参照してください.
SQLSTATE値に加え、MySQLエラーコードもサポートされています.
20.2.10.2.DECLAREプロセッサ
この文は、1つ以上の条件を処理できるプロセッサを指定します.1つ以上の条件が生成されると、指定された文が実行されます.
CONTINUEプロセッサの場合、現在のサブルーチンの実行は、プロセッサ文の実行後に続行されます.EXITプロセッサの場合、現在のBEGIN...END複合文の実行が終了します.UNDOハンドラタイプ文はサポートされていません.
・SQLWARNINGは、01で始まるすべてのSQLSTATEコードの速記である.
・NOT FOUNDは、02で始まるすべてのSQLSTATEコードの速記である.
・SQLEXCEPTIONは、SQLWARNINGまたはNOT FOUNDによってキャプチャされていないすべてのSQLSTATEコードの速記である.
SQLSTATE値に加え、MySQLエラーコードもサポートされていません.
例:
なお,@xは3であり,これはMySQLがプログラムの最後に実行されたことを示す.DECLARE CONTINUTE HANDLER FOR SQLSTATE'23000'SET@x 2=1の場合.この行はありません.2番目のINSERTがPRIMARY KEY強制に失敗した後、MySQLはデフォルト(EXIT)パスを取った可能性があり、SELECT@xは2を返した可能性があります.
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を返した可能性があります.