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?
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
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. |
+----------------------------------------------------+
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.
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
vous devez définir les gestionnaires d'exception . Regardez http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html