Handler können nur in Stored Functions oder Stored Procedures verwendet werden

Definition

DECLARE {CONTINUE | EXIT}-HANDLER FOR 
{SQLSTATE sqlstate_code | MySQL-Fehlercode | condition_name |SQLWARNING | NOT FOUND | SQLEXCEPTION} handler_actions

Die Definition muss nach der Deklaration aller Variablen, und vor allen ausführbaren Anweisungen stattfinden.

Handler Bedingungen

  • einen MySQL-Fehlercode verwenden
  • einen ANSI-Standard SQLSTATE-Code verwenden
  • eine benannte Bedingung definieren
  • SQLWARNING (Abkürzung für die SQLSTATE-Fehlerklasse ‘01’)
  • NOT FOUND (Abkürzung für die SQLSTATE-Fehlerklasse ‘02’),
  • SQLEXCEPTION (Abkürzung für die nicht zu den SQLSTATE-Fehlerklassen ‘01’ und ‘02’ gehören)

Handler-Typen

Continue

Bei einem CONTINUE HANDLER wird die Ausführung mit der Anweisung fortgesetzt, die auf die verursachende Anweisung folgt.

Beispiel

DELIMITER ||
CREATE PROCEDURE myProcedure ()
BEGIN
	DECLARE err INT DEFAULT 0;
	DECLARE CONTINUE HANDLER FOR <MYSQL_ERROR_NR> SET err=1;
	
	# Statements
	
	IF(err=1)THEN
		SELECT "Ein Fehler ist aufgetreten!" as "Result";
	ELSE
		SELECT <Ergebnis> as "Result";  
	END IF; 
END||
DELIMITER ;
 
CALL myProcedure;

EXIT

Wenn ein EXIT HANDLER ausgelöst wird, wird der aktuell ausgeführte Block beendet. Wenn dieser Block der Hauptblock für das gespeicherte Programm ist, wird die Prozedur beendet, und die Steuerung wird an die Prozedur oder das externe Programm zurückgegeben, das die Prozedur aufgerufen hat. Ist der Block in einem äußeren Block eingeschlossen, wird die Kontrolle an diesen äußeren Block zurückgegeben.

Beispiel

DELIMITER ||
CREATE PROCEDURE add_department(in_dept_name VARCHAR(30), 
								in_location VARCHAR(30), 
								in_manager_id INT) 
MODIFIES SQL DATA
BEGIN 
	DECLARE duplicate_key INT DEFAULT 0;
	BEGIN
		DECLARE EXIT HANDLER FOR 1062 SET duplicate_key=1;
		INSERT INTO departments (department_name,location,manager_id)
		VALUES(in_dept_name,in_location,in_manager_id); 
		SELECT CONCAT('Department ',in_dept_name,' created') as "Result"; 
	END;
	IF duplicate_key=1 THEN 
		SELECT CONCAT('Failed to insert ',in_dept_name, 17 ': duplicate key') 
		as "Result"; 
	END IF; 
END||
DELIMITER ;