it-swarm.com.de

So lösen Sie einen Fehler in einer MySQL-Funktion aus

Ich habe eine MySQL-Funktion erstellt und möchte einen Fehler auslösen, wenn die für die Parameter übergebenen Werte ungültig sind. Welche Möglichkeiten habe ich, um einen Fehler in einer MySQL-Funktion auszulösen?

61
Dónal

MySQL 5.5 führt Signale ein, die Ausnahmen in anderen Sprachen ähneln:

http://dev.mysql.com/doc/refman/5.5/en/signal.html

Zum Beispiel im Befehlszeilen-Client mysql:

mysql> SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Custom error';
ERROR 1644 (45000): Custom error
73
Austin Hyde

Es ist eigentlich eine Kombination aller drei Antworten. Sie rufen eine nicht vorhandene Prozedur auf, um den Fehler auszulösen, und deklarieren dann einen Exit-Handler, der den von Ihnen generierten Fehler abfängt. In diesem Beispiel wird mit SQLSTATE 42000 (Prozedur ist nicht vorhanden) ein Fehler vor dem Löschen ausgegeben, wenn für die zu löschende Zeile eine Fremdschlüssel-ID festgelegt ist:

DROP PROCEDURE IF EXISTS decount_test;

DELIMITER //

CREATE DEFINER = 'root'@'localhost' PROCEDURE decount_test ( p_id bigint )
DETERMINISTIC MODIFIES SQL DATA
BEGIN
  DECLARE EXIT HANDLER FOR SQLSTATE '42000'
    SELECT 'Invoiced barcodes may not have accounting removed.';
  IF (SELECT invoice_id 
       FROM accounted_barcodes
       WHERE id = p_id
    ) THEN
    CALL raise_error;
 END IF;
 DELETE FROM accounted_barcodes WHERE id = p_id;
END //

DELIMITER ;

Ausgabe:

call decount_test(123456);
+----------------------------------------------------+
| Invoiced barcodes may not have accounting removed. |
+----------------------------------------------------+
| Invoiced barcodes may not have accounting removed. | 
+----------------------------------------------------+
25
Ryan M

Warum nicht einfach ein VARCHAR in einer deklarierten INTEGER Variablen speichern?

DELIMITER $$ DROP FUNCTION IF EXISTS `raise_error` $$
CREATE FUNCTION `raise_error`(MESSAGE VARCHAR(255)) 
RETURNS INTEGER DETERMINISTIC BEGIN
  DECLARE ERROR INTEGER;
  set ERROR := MESSAGE;
  RETURN 0;
END $$ DELIMITER ;
-- set @foo := raise_error('something failed'); -- or within a query

Fehlermeldung ist:

Falscher ganzzahliger Wert: 'etwas ist fehlgeschlagen' für Spalte 'FEHLER' in Zeile 1

Es ist nicht perfekt, aber es gibt eine ziemlich beschreibende Nachricht und Sie müssen keine Erweiterungs-DLLs schreiben.

8
user645280

In MySQL 5 können Sie einen Fehler auslösen, indem Sie eine gespeicherte Prozedur aufrufen, die nicht existiert (CALL raise_error) oder einen ungültigen Wert an eine Abfrage übergeben (wie null an ein nicht mit NULL belegtes Feld). Hier ist ein interessanter Beitrag von Roland Bouman zum Auslösen von Fehlern innerhalb einer MySQL-Funktion:

http://rpbouman.blogspot.com/2005/11/using-udf-to-raise-errors-from-inside.html

5

Sie können auch eine vorhandene Funktion mit einer ungültigen Anzahl von Argumenten aufrufen.

2

Sie müssen Ausnahmebehandlungsroutinen definieren. Schauen Sie sich http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html an

0