Requêtes préparées

Les requêtes préparées ou prepared statement sont une fonctionnalité que proposent certaines bases de données et qui permet d’exécuter de façon très performante la même requête ou des requêtes très similaires.

Concrètement, il s’agit d’un modèle (template) de requêtes SQL dans lequel on peut inclure un ou plusieurs paramètres : une requête « texte à trous » en quelque sorte.

Voici un exemple de requêtes préparées :

SELECT * FROM entreprise WHERE codepostal = ?;

INSERT INTO commande (ref, nombre, prix) VALUES (?, ?, ?);

 

Depuis le SQL, on utilise alors les instructions PREPARE, EXECUTE et DEALLOCATE pour préparer, exécuter et supprimer la requête préparée. Ces instructions sont rarement utilisées depuis du SQL pur et c’est souvent le langage de programmation utilisé qui s’en charge.

Une requête préparée se formalise en 3 phases :

  • Lors de la préparation, la requête est écrite et les valeurs à remplacer sont substituées par un marqueur (soit : soit ?). C’est la phase la plus importante pour l’utilisateur car c’est ici que le cerveau humain est le plus sollicité ;
  • Ensuite vient l’étape de la compilation qui est réalisée par la machine ;
  • Enfin, lors de l’exécution, les valeurs vont être insérées dans la requête à la place des marqueurs et la requête pourra être exécutée.

L’intérêt des requêtes préparés est multiple :

  • Gain de temps et amélioration de la qualité : la requête initiale est conçue une seule fois et elle fonctionne ensuite à tous les coups. Cela fait gagner du temps et minimise les risques d’erreurs ;
  • Meilleure sécurisation : les requêtes préparées sont un garde-fou contre les injections SQL parce que les données insérées dans la requête sont isolés de cette dernière ;
  • Limitation de la bande passante entre le client et le serveur ;
  • Plus de rapidité : les requêtes préparées sont rapides et moins consommatrices de ressources car elles ne sont compilées qu’une seule fois.

Parce qu’elles sont préparées, ces requêtes ne sont utiles que si elles sont utilisées plusieurs fois. Elle n’ont aucun intérêt si elle sont utilisée seulement quelque fois. Les requêtes préparées ne sont pas non plus des procédures stockées. Elles ne s’appliquent qu’à la session courante (le thread ou session ouverte par l’utilisateur).

Les SGBD les plus utilisés supportent les requêtes préparés. C’est le cas pour MySQL, SQL Server, Oracle, DB2 et PostgreSQL. Les langages de programmation majeurs savent aussi les utiliser et lorsque le SGBD sous-jacent ne supporte pas les requêtes préparées, des bibliothèques dédiées savent les émuler.