In MySQL erfordern bestimmte Ausnahmen eine spezielle Behandlung. Diese Ausnahmen können mit Fehlern sowie einer allgemeinen Flusskontrolle innerhalb der Unterroutine verknüpft sein. Durch das Definieren von Ausnahmen werden die während der Programmausführung auftretenden Probleme im Voraus definiert. Die Ausnahmebehandlung definiert die Behandlungsmethode, die angewendet werden soll, wenn Probleme auftreten, und stellt sicher, dass gespeicherte Prozeduren oder Funktionen weiterhin ausgeführt werden können, wenn Fehler oder Warnungen auftreten.
1 Ausnahmedefinition
1.1 Syntax
DECLARE Bedingungsname BEDINGUNG FÜR
[condition_type];
1.2 Beschreibung
Der Parameter „condition_name“ stellt den Namen der Ausnahme dar; SQLSTATE
[VALUE] sqlstate_value|mysql_error_code besteht aus:
2 Benutzerdefinierte Ausnahmebehandlung
2.1 Ausnahmebehandlungssyntax
//方法一:使用sqlstate_value DECLARE command_not_allowed CONDITION FOR SQLSTATE '42000′; //方法二:使用mysql_error_code DECLARE command_not_allowed CONDITION FOR 1148;
DECLARE handler_type HANDLER FOR condition_value [,...] sp_statementhandler_type ist die Fehlerbehandlungsmethode und der Parameter ist einer von drei Werten;
CONTINUE bedeutet, dass die Ausführung ohne Verarbeitung fortgesetzt wird; 🎜> EXIT bedeutet, dass ein Fehler aufgetreten ist.
UNDO bedeutet, den vorherigen Vorgang rückgängig zu machen, nachdem ein Fehler aufgetreten ist.
condition_value: SQLSTATE [VALUE] sqlstate_value|. Bedingungsname|SQLWARNING|NOT
FOUND|SQLEXCEPTION|mysql_error_code
condition_value gibt den Fehlertyp an
SQLSTATE [VALUE]
sqlstate_value ist ein String-Fehlerwert mit 5 Zeichen;
bedingungsname bedeutet DECLARE
Der durch CONDITION definierte Fehlerbedingungsname stimmt mit allen SQLSTATE-Fehlercodes überein, die mit 01 beginnen
FOUND stimmt mit allen SQLSTATE-Fehlercodes überein, die mit 02 beginnen. SQLEXCEPTION stimmt mit allen SQLSTATE-Fehlercodes überein, die nicht SQLWARNING oder NOT sind
Von FOUND erfasster SQLSTATE-Fehlercode;
mysql_error_code entspricht dem numerischen Fehlercode
2.3 Ausnahmeabfangmethode
/
3 Umfassendes Beispiel
Erstellen Sie eine Tabelle, legen Sie den Primärschlüssel der Tabelle fest und sehen Sie sich die Ausführung an, ohne die Ausnahmebehandlung zu definieren und die Ausnahmebehandlung zu definieren Welcher Schritt./方法一:捕获sqlstate_value异常 //这种方法是捕获sqlstate_value值。如果遇到sqlstate_value值为”42S02″,执行CONTINUE操作,并输出”NO_SUCH_TABLE”信息 DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02′ SET @info='NO_SUCH_TABLE'; //方法二:捕获mysql_error_code异常 //这种方法是捕获mysql_error_code值。如果遇到mysql_error_code值为1146,执行CONTINUE操作,并输出”NO_SUCH_TABLE”信息; DECLARE CONTINUE HANDLER FOR 1146 SET @info='NO_SUCH_TABLE'; //方法三:先定义条件,然后捕获异常 DECLARE no_such_table CONDITION FOR 1146; DECLARE CONTINUE HANDLER FOR NO_SUCH_TABLE SET @info='NO_SUCH_TABLE'; //方法四:使用SQLWARNING捕获异常 DECLARE EXIT HANDLER FOR SQLWARNING SET @info='ERROR'; //方法五:使用NOT FOUND捕获异常 DECLARE EXIT HANDLER FOR NOT FOUND SET @info='NO_SUCH_TABLE'; //方法六:使用SQLEXCEPTION捕获异常 DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info='ERROR';
Beispiel 1: Ohne Definition von Ausnahmen
show databases; use wms; create table location ( location_id int primary key, location_name varchar(50) );
Hinweis: Bevor Sie Beispiel 2 ausführen, müssen Sie die Daten in der Tabelle löschen, sich abmelden und erneut anmelden, um den Einfluss der Clientvariablen @x zu vermeiden. Detaillierte Anweisungen finden Sie im ersten Punkt im Fazit.
DELIMITER // CREATE PROCEDURE handlerInsertNoException() BEGIN /*DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2=1;*/ SET @x=1; INSERT INTO location VALUES (1,'Beijing'); SET @x=2; INSERT INTO location VALUES (1,'Wuxi'); SET @x=3; END; // DELIMITER ;Beispiel 2: Beim Definieren der Ausnahmebehandlung:
mysql> call handlerInsertNoException(); ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY' mysql> select @x; +------+ | @x | +------+ | 2 | +------+ 1 row in set (0.00 sec) mysql> select * from location; +-------------+---------------+ | location_id | location_name | +-------------+---------------+ | 1 | Beijing | +-------------+---------------+ 1 row in set (0.00 sec)
Erklärung und Schlussfolgerung:
mysql> truncate table location; Query OK, 0 rows affected (0.04 sec) mysql> select * from location; Empty set (0.00 sec) mysql> exit; Bye david@Louis:~$ mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 53 Server version: 5.5.38-0ubuntu0.14.04.1 (Ubuntu) mysql> use wms; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select * from location; Empty set (0.00 sec) mysql> select @x; +------+ | @x | +------+ | NULL | +------+ 1 row in set (0.00 sec)
1. In MySQL stellt @var_name Benutzervariablen dar und verwendet die SET-Anweisung, um ihnen Werte zuzuweisen. Variablen, die von einem Client definiert werden, sind nicht möglich von anderen Kunden eingesehen oder genutzt werden. Wenn der Client beendet wird, werden alle Variablen für diese Clientverbindung automatisch freigegeben.
DELIMITER // CREATE PROCEDURE handlerInsertWithException() BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2=1; SET @x=1; INSERT INTO location VALUES (1,'Beijing'); SET @x=2; INSERT INTO location VALUES (1,'Wuxi'); SET @x=3; END; // DELIMITER ;
2. Da in Beispiel 1 die Ausnahmeanweisung „“ mit Anmerkungen versehen ist, löst das Einfügen desselben Primärschlüssels in die Tabelle eine Ausnahme aus und verwendet den Standardpfad (EXIT) und zeigt dies an. x gibt 2 zurück, was bedeutet, dass die folgende INSERT-Anweisung beendet wurde, ohne ausgeführt zu werden.
mysql> CALL handlerInsertWithException(); Query OK, 0 rows affected (0.09 sec) mysql> select @x; +------+ | @x | +------+ | 3 | +------+ 1 row in set (0.00 sec)
3. Die Ausnahmebehandlung ist definiert. Wenn zu diesem Zeitpunkt ein Fehler auftritt, wird die Ausführung gemäß der Ausnahmedefinition fortgesetzt. aber Nur die ersten Daten werden in die Tabelle eingefügt. Zu diesem Zeitpunkt zeigt die Benutzervariable @x=3 an, dass die Ausführung beendet ist.
Das Obige ist die detaillierte Erklärung von MySQL Ich hoffe, dass es für alle hilfreich ist. Weitere verwandte Artikel finden Sie auf der chinesischen PHP-Website (www.php.cn).