Heim  >  Artikel  >  Datenbank  >  Detaillierte Erläuterung der MySQL-Ausnahmedefinition und Ausnahmebehandlung

Detaillierte Erläuterung der MySQL-Ausnahmedefinition und Ausnahmebehandlung

黄舟
黄舟Original
2016-12-15 16:11:521333Durchsuche

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:

Sowohl sqlstate_value als auch mysql_error_code können MySQL-Fehler darstellen; sqlstate_value ist ein Fehlercode vom Typ String mit der Länge 5; 1148(42000)" Fehler, der Name ist command_not_allowed. Es gibt zwei Methoden:




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;


2.2 Parameterbeschreibung


handler_type: CONTINUE|EXIT|UNDO
DECLARE handler_type HANDLER FOR condition_value [,...] sp_statement

handler_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


Gespeicherte Prozedur und Ergebnis aufrufen:


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:


Aufrufen gespeicherter Prozeduren und Ergebnisse:
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).


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn