Function

Vous êtes ici : >> SQL / Fonction
Temps d'étude : 45 min. Niveau : Moyen.
Tags : Base de données, cours sql, Fonction
Fichier(s) utile(s) pour ce cours : employes.sql

Les fonctions

Une fonction est un morceau de code prévu pour s'exécuter et réaliser un traitement et/ou fournir un résultat.

Certaines fonctions sont prédéfinies (prévues et disponibles par le langage SQL) et d'autres peuvent être inscrites par le développeur (on appelle ça des fonctions utilisateurs ou en anglais : user function).

On ne doit pas connaitre par coeur toutes les fonctions d'un langage (parce que ça ne sert à rien et parce que cela est mis à jour avec le temps) néanmoins un bon développeur est autonome et est capable de trouver son information tout seul via la doc technique Mysql.

Fonctions prédéfinies

Voici quelques exemples de fonctions prédéfinies :

Fonction Prédéfinie Description
SELECT CURDATE();
Affiche la date courante
Pratique pour afficher des chambres d'hotel à reserver, ainsi personne n'aura à modifier la requête pour actualiser la date.
SELECT CURDATE() + 0;
Affiche la date courante sans tirets
Ce format est pratique pour nommer un fichier à la date du jour.
SELECT CURTIME();
Affiche l'heure courante
SELECT NOW();
Affiche la date et l'heure courante
SELECT DATE_ADD('2016-01-02', INTERVAL 31 DAY);
Affiche une date future (avec 31 jours de plus).
SELECT DATE_FORMAT('2012-10-03 22:23:00', '%d/%m/%Y - %H:%i:%s');
SELECT *, DATE_FORMAT(date_rendu,'le %d/%m/%Y') FROM emprunt;
Redéfinit le format de la date
(format Français dans l'exemple)
SELECT CONCAT('a','b','c');
Permet de concaténer (faire suivre) des informations
SELECT CONCAT_WS(' - ','a','b','c');
Permet de concaténer (faire suivre) des informations avec un séparateur
WS = With Separator
Cette fonction est très pratique pour réunir dans une même colonne plusieurs champs / colonnes différents comme l'adresse, le code postal et la ville.
SELECT LENGTH('moi');
Indique la longueur d'une chaine (nombre de caractères)
SELECT SUBSTRING('bonjour',4);
Permet de couper une chaine
Dans notre exemple : à partir du 4e caractère.
SELECT TRIM('  bonsoir   '); 
Permet de supprimer les espaces en début et en fin de chaine.
SELECT DATABASE();
Indique quelle base de données est en cours d'utilisation.
SELECT LAST_INSERT_ID();
Indique quel est le dernier identifiant généré par une base de données (après une requête INSERT).
SELECT PASSWORD('mypass');
Permet de crypter une chaine sur l'algorythme AES.
Cela peut être utilisé lors d'une insertion en table.


Bien entendu, il existe beaucoup d'autres fonctions SQL qui peuvent rendre service au développeur.

Fonctions Utilisateur

Une fonction utilisateur est créée par le développeur pour un besoin spécifique réccurrent.

En effet, si une tache ou un traitement précis est souvent effectué, il est souvent de bon augure d'isoler ces lignes de code dans une fonction que l'on pourra exécuter à tout moment plus facilement.

Voici le cycle a respecter pour se servir de fonctions utilisateur (fonctions personnalisées à nos besoins) :

fléche 1- La déclaration de la fonction (cela permet de la créer, si nous voulons l'utiliser plus tard il faut déjà qu'elle existe)

fléche 2- L'exécution de la fonction (cela correspond à la même démarche que pour les fonctions prédéfinies)

Imaginons que le comptable nous envoie toujours les informations des employés avec leur salaire brut mais que nous ayons pour consigne d'insérer le salaire net.

Ce calcul sera répétitif.

Voici une fonction qui consisterait à transformer le salaire brut d'un employé en salaire net :

Dans cet exemple nous considérerons que le taux de différence entre le salaire brut et le salaire net est toujours de 20 %

SQL / Fonction Utilisateur (personnalisé)
	DELIMITER $
	CREATE FUNCTION salaire_brut_en_net(sal INT) RETURNS INT
	COMMENT 'Fonction permettant le calcul de salaire'
	READS SQL DATA
	BEGIN
		RETURN (sal*0.8); 
	END $
	DELIMITER ;
	


Explications : Chaque ligne expliquée

DELIMITER $
Le delimiter permet de modifier le signe de reconnaissance de MYSQL du point-virgule (;) par le signe dollar ($).
Nous modifions ce signe car nous devons mettre des points-virgules à certains moments de nos instructions (dans le corps de la fonction) et nous ne souhaitons pas que Mysql pense qu'il s'agit de la fin de notre fonction et qu'ils exécute un code qui ne serait pas terminé.


CREATE FUNCTION
permet de créer une fonction


salaire_brut_en_net
représente le nom de notre fonction (choisissez un nom explicite et en cohérence avec le traitement réalisé)


(sal INT)
représente un argument (paramètre) entrant de type INTeger (nombre)
Ceci signifie que notre traitement a besoin d'une information pour réaliser son traitement correctement.
Nous prévoyons l'argument entrant lors de la déclaration de la fonction mais celui-ci ne sera précisé qu'au moment de l'exécution de la fonction.


RETURNS INT
nous indiquons que notre fonction est destinée à retourner une valeur de type INTeger (nombre)


COMMENT 'Fonction permettant le calcul de salaire'
commentaire d'accompagnement pour mieux l'appréhender lors du listing des fonctions disponibles.


READS SQL DATA
Cette ligne permet d'indiquer au système que notre traitement ne fera que lire (et non pas modifier, supprimer) des données.

BEGIN
Début de nos instructions


RETURN (sal*0.8);
Nous retournerons le salaire multiplié par 0,8 %, c'est à dire que l'on retire 20 % et qu'on garde seulement 80 % du chiffre qu'on nous aura communiqué (avec l'argument entrant).
Return est aussi le mot clé permettant de renvoyer une valeur et généralement terminer une fonction
Dans notre cas, c'est à la fois le début et la fin de notre traitement (puisqu'il s'agit de notre unique instruction).
Nous aurions pu mettre plusieurs lignes entre begin et end, cela est illimité.


END
Fin de nos instructions


DELIMITER ;
Permet de retrouver le delimiter d'origine.


Pour tester si notre fonction fonctionne, il faut l'exécuter :

SQL / Fonction Utilisateur (personnalisé)
	-- 1er exemple (test sur un nombre)
	SELECT salaire_brut_en_net(2500);
	-- 2e exemple (test lors d'une insertion)
	INSERT INTO employes (prenom, salaire) values ('test', salaire_brut_en_net(3200));
	SELECT * FROM employes;
	-- 3e exemple (test lors d'une selection)
	SELECT prenom, salaire_brut_en_net(salaire) FROM employes;
	

A travers ces exemples, nous constatons que l'on peux exécuter notre fonction dans différents contextes et plusieurs fois de suite.

Tant que cette fonction n'est pas supprimée, cette fonction restera en mémoire dans le système et sera utilisable sur la base de données sur laquelle elle a été créée.

Pour supprimer une fonction :

DROP FUNCTION salaire_brut_en_net ;

Pour consulter les fonctions déclarées / disponibles :

SHOW FUNCTION STATUS ;