143 votes

Comment déboguer les procédures stockées de MySQL ?

Mon processus actuel de débogage des procédures stockées est très simple. Je crée une table appelée "debug" dans laquelle j'insère les valeurs des variables de la procédure stockée pendant son exécution. Cela me permet de voir la valeur de n'importe quelle variable à un moment donné dans le script, mais existe-t-il un meilleur moyen de déboguer les procédures stockées MySQL ?

3 votes

Existe-t-il des options d'interface graphique pour les utilisateurs non-Windows ? Devoir exécuter une copie de Windows juste pour déboguer les procédures stockées est un peu difficile. Et la plupart des options d'insertion de table échouent si vous êtes dans une transaction que vous êtes sur le point d'annuler.

78voto

Brad Parks Points 5513

Les éléments suivants debug_msg peut être appelée pour afficher simplement un message de débogage sur la console :

DELIMITER $$

DROP PROCEDURE IF EXISTS `debug_msg`$$
DROP PROCEDURE IF EXISTS `test_procedure`$$

CREATE PROCEDURE debug_msg(enabled INTEGER, msg VARCHAR(255))
BEGIN
  IF enabled THEN
    select concat('** ', msg) AS '** DEBUG:';
  END IF;
END $$

CREATE PROCEDURE test_procedure(arg1 INTEGER, arg2 INTEGER)
BEGIN
  SET @enabled = TRUE;

  call debug_msg(@enabled, 'my first debug message');
  call debug_msg(@enabled, (select concat_ws('','arg1:', arg1)));
  call debug_msg(TRUE, 'This message always shows up');
  call debug_msg(FALSE, 'This message will never show up');
END $$

DELIMITER ;

Ensuite, exécutez le test comme ceci :

CALL test_procedure(1,2)

Il en résultera la sortie suivante :

** DEBUG:
** my first debug message
** DEBUG:
** arg1:1
** DEBUG:
** This message always shows up

9 votes

Cela ne semble pas fonctionner pour FUNCTIONS et je ne sais pas pourquoi. Cela donne toujours "Error Code : 1415. Non autorisé à renvoyer un ensemble de résultats à partir d'une fonction". Existe-t-il un recours ?

1 votes

@PatrickM Les fonctions ne peuvent pas renvoyer de lignes ("result") alors que cette procédure de débogage s'appuie sur elle (les messages de débogage sont des resultsets renvoyés dans l'appel de la procédure). Dans les fonctions, vous pouvez seulement INSERT INTO my_log_table (message) VALUES (msg) et peut-être récupérer tous les messages de débogage une fois que les appels de fonction sont terminés (c'est-à-dire que vous êtes de retour dans la procédure).

1 votes

Cette approche est bonne mais l'écriture dans la console n'est pas efficace sur MySQL Workbench comme sur les IDEs, car chaque instruction "select" ouvre un nouveau panneau de résultats. Je pense qu'il est préférable de créer une table temporaire pour enregistrer les messages d'erreur avec l'horodatage et le nom de la procédure.

48voto

Bob Probst Points 4502

Je fais quelque chose de très similaire à vous.

J'inclus généralement un paramètre DEBUG dont la valeur par défaut est false et que je peux régler sur true au moment de l'exécution. Ensuite, j'intègre les instructions de débogage dans un bloc "If DEBUG".

J'utilise également un tableau d'enregistrement pour un grand nombre de mes travaux afin de pouvoir examiner les processus et les délais. Mon code de débogage y est également affiché. J'y inclus le nom du paramètre appelant, une brève description, le nombre de lignes concernées (le cas échéant), un champ de commentaires et un horodatage.

Les bons outils de débogage sont l'une des tristes lacunes de toutes les plateformes SQL.

3 votes

Pas toutes les plateformes @Bob Probst , les outils de débogage de Sybase sont tout à fait décents avec un débogage par points d'arrêt pour les déclencheurs et les procédures stockées.

31voto

George Points 109

Oui, il existe des outils spécialisés pour ce genre de choses - Débogueur MySQL .
enter image description here

7 votes

J'avais tellement hâte de l'essayer. Malheureusement, c'est une épave totale. Je reçois le message d'erreur "function coalesce does not exist" supposé provenir de mysql, en conséquence de quoi l'interface graphique se branche incorrectement sur le code SP (bien que MySQL l'exécute correctement). Sans parler des variables locales "DECLARE var DEFAULT value". Elles apparaissent comme NULL alors qu'elles ne le sont clairement pas. Oh, et aussi "Undeclared identifier : 'FETCH_RADIUS_DISTSORT'" alors que c'était une instruction compilée. Ce n'est pas recommandé.

4 votes

Ce n'est pas parfait mais mon essai a été une expérience très différente de celle rapportée par @kellogs ci-dessus. L'outil est agréable et léger et semble faire juste ce qu'il faut sans être encombrant. L'expérience a été bien meilleure pour moi que celle des autres outils testés (c'est-à-dire Visual Studio, Toad et dbForge Studio, qui présentaient tous des défauts majeurs - je les décrirais tous comme une "épave totale" en comparaison). Je ne sais pas si c'est parce que la fonction déboguée n'incluait aucune des constructions défectueuses ou si les problèmes ont été résolus.

2 votes

J'ai également trouvé cet outil très utile pour déboguer mes procédures stockées.

20voto

Josef Miran Points 1

Hay Outils GUI pour le débogage des procédures stockées / fonctions et scripts dans MySQL. Un outil décent que dbForge Studio pour MySQL, a des fonctionnalités riches et la stabilité.

0 votes

Il est difficile de trouver sur quelles plateformes cet outil de débogage fonctionne. Il semble fonctionner sous Windows. Y a-t-il autre chose ?

7voto

Ash Machine Points 2491

Je place simplement des instructions select dans les zones clés de la procédure stockée pour vérifier l'état actuel des ensembles de données, puis je les commente (--select...) ou les supprime avant la mise en production.

0 votes

Oui, je fais exactement la même chose. Je place une instruction de sélection et je vérifie l'état des tables et des valeurs associées. Parfois, j'utilise une table temporaire pour insérer des valeurs dans les tables et, une fois la solution trouvée, je supprime les tables temporaires et les instructions de sélection.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X