Fonction stockée mysql

A la différence d’une procédure une fonction stockée est conçue pour retourner un résultat. Celà va nous permettre de réaliser un calcul dans la fonction puis de l’utiliser au choix dans une procédure ou dans une requête de sélection. L’exemple qui va suivre est volontairement très simple mais l’utilisation d’une fonction prend tout son sens lorsque le calcul devient complexe.

Pour rappel, les

Le schéma

CREATE TABLE `personne` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `first_name` varchar(45) NOT NULL,
  `last_name` varchar(45) NOT NULL,
  PRIMARY KEY  (`id`)
)

CREATE TABLE `commande` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `date` timestamp NOT NULL default CURRENT_TIMESTAMP,
  `id_personne` int(10) unsigned NOT NULL,
  PRIMARY KEY  (`id`)
)

La fonction
Pour exemple, nous allons réaliser une fonction trés simple, qui prend en argument l’identifiant d’une personne et retourne le nombre de commandes enregistrées pour celle-ci.

delimiter//
CREATE FUNCTION fct_num_commandes(in_id_personne INTEGER)
	RETURNS INTEGER
	DETERMINISTIC
BEGIN
	# déclare une variable pour stocker le résultat
	DECLARE i_num_cmd INTEGER;
	# déclare un curseur pour récupérer le résultat
	DECLARE c_num_cmd CURSOR FOR 
	SELECT COUNT(*)
	FROM commande
	WHERE id_personne=in_id_personne;
	
	# ouvre le curseur et place le résultat dans la variable i_num_cmd
	OPEN c_num_cmd;
	FETCH c_num_cmd INTO i_num_cmd;
	CLOSE c_num_cmd;
	
	# retourne le résultat
	RETURN i_num_cmd;
END
//

Pour rappel, pour exécuter la déclaration de cette fonction, vous devez utiliser Mysql Query Browser, c’est très compliqué avec le client mysql en ligne de commande et impossible avec PHPMyAdmin.

Utiliser la fonction dans une requête de sélection
Vous pouvez maintenant utiliser votre fonction directement depuis une requête :

SELECT *, fct_num_commandes(id) AS num_commandes FROM personne

Conclusion
L’exemple fourni n’est pas à l’image de ce que permet ce type de fonction. L’utilisation d’une fonction stockée prendra tout son sens si le calcul est complexe. L’utilisation d’une procédure stockée pour récupérer une donnée calculée dans une requête de sélection se fera à la place de la bonne vielle méthode qui consistait à faire une première requête sélect puis à réaliser le calcul dans le langage hôte (exemple PHP) avec éventuellement une paire de requêtes dans le calcul. L’utilisation d’une fonction stockée est beaucoup plus intéressante parce qu’on évite de multiples allers et retours entre le langage hôte et le serveur MySQL d’autant plus pénalisants si les 2 sont hébergés sur des serveurs distincts.

Créer des procédures stockées MySQL
Un bon bouquin sur les procédures stockées mysql(en anglais) totalement consacré au sujet des procédure stockées. D’autant plus nécessaire que ce sujet est trés mal documenté dans la documentation mysql et qu’il ne traite que de ce sujet (déclencheurs et procédures stockées) et qu’à mon sens c’est le seul.

Si vous en connaissez un autre (éventuellement en français) laissez un commentaire pour l’indiquer.

Laisser un commentaire

Enter the following characters/numbers into the box below, please!
Sample verification