Comment faire apparaître une erreur dans une fonction MySQL

j'ai créé une fonction MySQL et je voudrais soulever une erreur si les valeurs passées pour les paramètres sont invalides. Quelles sont mes options pour générer une erreur dans une fonction MySQL?

58
demandé sur dolmen 2009-01-21 18:22:37

6 réponses

MySQL 5.5 présente les signaux, qui sont similaires à des exceptions dans d'autres langues:

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

par exemple, dans le client en ligne de commande mysql :

mysql> SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Custom error';
ERROR 1644 (45000): Custom error
65
répondu Austin Hyde 2012-08-06 13:39:44

c'est en fait une combinaison des trois réponses. Vous appelez une procédure inexistante pour augmenter l'erreur, puis déclarez un gestionnaire de sortie qui saisit l'erreur que vous avez générée. Voici un exemple, en utilisant SQLSTATE 42000 (la procédure n'existe pas) pour lancer une erreur avant la suppression si la ligne à supprimer a un jeu d'id de clé étrangère:

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 ;

sortie:

call decount_test(123456);
+----------------------------------------------------+
| Invoiced barcodes may not have accounting removed. |
+----------------------------------------------------+
| Invoiced barcodes may not have accounting removed. | 
+----------------------------------------------------+
25
répondu Ryan M 2012-02-13 15:22:58

pourquoi ne pas simplement stocker un VARCHAR dans une variable déclarée INTEGER ?

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

message d'erreur est:

valeur entière incorrecte: 'something failed' pour la colonne 'ERROR' dans la rangée 1

ce n'est pas parfait, mais il donne un joli message descriptif et vous n'avez pas à écrire une extension DLLs.

6
répondu 2013-02-12 19:56:10

dans MySQL 5 vous pouvez soulever une erreur en appelant une procédure stockée qui n'existe pas (CALL raise_error) ou en passant une valeur invalide à une requête (comme null à un champ non NULL contrained). Voici un billet intéressant de Roland Bouman sur "raising errors from within a MySQL function:

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

5
répondu Patrick de Kleijn 2009-03-31 23:45:42

vous pouvez aussi appeler une fonction existante avec un nombre invalide d'arguments.

2
répondu 2009-07-06 17:45:52

vous devez définir les gestionnaires d'exception . Regardez http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html

0
répondu Jorge Niedbalski R. 2009-01-21 20:24:23