Procédures stockées (minimum)

Les procédures stockées et les fonctions sont de nouvelles fonctionnalités de MySQL version 5.0. Une procédure stockées est un jeu de commandes SQL qui réside sur le serveur. Une fois qu’elle sont enregistrées, les clients n’ont pas besoin de soumettre chaque commande individuellement, mais peuvent les lancer d’un seul coup.

Les procédures stockées fournissent un gain de performances, car moins d’informations sont échangées entre le serveur et le client. En échange, cela augmente la charge du serveur, car ce dernier doit réaliser plus de travail.

Création

Les procédures stockées sont créées avec la commande CREATE PROCEDURE

CREATE PROCEDURE nomdelaprocedure (parametres separés par des virgules)

BEGIN

(Code de la procédure…)

END

Utilisation

Une procédure est appelée avec la commande CALL, et ne peut retourner de valeur que via les variables de retour.

 

Un petit exemple :

soit une table films

 describe films;
+-------------+--------------+------+-----+---------+-------+
| Field       | Type         | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| titre       | varchar(255) | NO   | PRI | NULL    |       |
| realisateur | varchar(100) | NO   | MUL | NULL    |       |
| annee       | year(4)      | NO   |     | NULL    |       |
+-------------+--------------+------+-----+---------+-------+

Une requête qui cherche les films d’un réalisateur (Stanley Kubrick) pourrait s’écrire :

 select titre from films
where realisateur like "%kub%";
+------------------------------+
| titre                        |
+------------------------------+
| 2001, l'odyssée de l'espace  |
| Eyes wide shut               |
| Full metal jacket            |
| L'ultime razzia              |
+------------------------------+

Créons une procédure stockée qui réalise ce genre ce chose pour un réalisateur au choix.

Ce réalisateur correspond à un paramètre entré (in) auquel on donne un nom et un type.

create
procedure cherche_realisateur(in nom varchar(100))
    -> select titre from films where realisateur like nom;

En pratique, il y a des parametres de types entré, sorte ou les deux:

in, out ou inout. ici, on entre une information (in)

Ensuite, on a plus qu’à appeler la procédure et observer le résultat.

call cherche_realisateur("%kub%");
+------------------------------+
| titre                        |
+------------------------------+
| 2001, l'odyssée de l'espace  |
| Eyes wide shut               |
| Full metal jacket            |
| L'ultime razzia              |
+------------------------------+

Cette procédure est enregistrée dans la base et peut donc resservir dans une autre session

 

Exemple :

stockee

En php avec pdo

On prépare la requete « call procedure » et ensuite, on l’exécute

<?php
try{$pdo = new PDO('mysql:host=localhost;dbname=cinema', 
                   'etudiant','etudiant');
$sql = 'call cherche_realisateur("%kub%") ';
$req = $pdo->prepare($sql);
$req->execute();
while($row = $req->fetch()){ $ligne=$row['titre'];
echo $ligne."<br>"; }

$req->closeCursor();// Termine le traitement de la requête

}

catch(Exception $e)

{        die('Erreur : '.$e->getMessage());}
?>

Si la  procédure contient plusieurs instructions terminées par un point-virgule, on est obligé de changer provisoirement de délimiteur ( le point-virgule)pour la créer et ensuite de rétablir l’ancien.

Pour cela mysql possède une fonction qui définit le délimiteur DELIMITER

DELIMITER $$ 

CREATE PROCEDURE testProcedure 

   BEGIN 
      /* 
      Requêtes SQL séparées par un point virgule (;)
      */ 
   END$$ 

DELIMITER ;

De plus ces instruction sont encadrées par BEGIN et END