Accueil > Bases de données relationnelles et indexation du contenu > En quoi le langage pl/pgsql simplifie-t-il la programmation d’applications (...)

En quoi le langage pl/pgsql simplifie-t-il la programmation d’applications web ?

mercredi 30 juin 2010, par Sandra R.

Le langage pl/pgsql est un langage itératif procédural utilisé dans le Système de Gestion de Base de Données (SGBD) PostGreSQL. Il permet de combiner des requêtes SQL entre elles afin d’exécuter des traitements plus complexes destinés à être stockés sur le serveur, mais également d’ajouter des structures de contrôle au langage SQL.

Ce langage, facile à maîtriser et à manipuler, est particulièrement apprécié des développeurs d’applications Web pour différentes raisons.

L’avantage majeur de l’utilisation de pl/pgSQL est sans aucun doute sa capacité à accroître les performances.
En effet, le SQL standard est un langage de requêtes qui nécessite d’exécuter chaque expression individuellement par le SGBD. Ainsi, l’application client doit fournir une requête au SGBD qui va la traiter plus ou moins rapidement, puis son résultat va induire des traitements supplémentaires et enfin envoyer d’autres requêtes au serveur. Ces étapes sont répétées un certain nombre de fois, et nécessitent donc un grand nombre de communications entre les serveurs d’application et de base de données. Ces contraintes peuvent provoquer une surcharge de réseau, surtout si les deux serveurs se trouvent sur des machines différentes. La base de données d’un service Web utilisant SQL serait alors vite submergée passé un certain volume d’accès simultanés.

Le langage pl/pgSQL permet de contourner ce problème car il permet de grouper un bloc de traitements et une série de requêtes SQL au sein du SGBD. Ce regroupement a pour conséquences de supprimer les allers-retours entre les deux serveurs et d’éviter de traiter les résultats intermédiaires dont le client n’a pas besoin. Les gains de temps et de performance alors engendrés dus à cette diminution d’échanges inter-serveurs sont appréciables pour une application Web, notamment dans le cadre de serveurs distants.

Un deuxième avantage indéniable est la possibilité, dans la programmation d’une fonction en pl/pgSQL, de spécifier un certain nombre d’arguments. Ainsi, l’appel à une fonction unique répondant à un besoin, en faisant varier les paramètres d’entrée, grâce à une seule requête inter-serveur, et ce indépendamment du nombre d’enregistrements de la table mise en cause, provoque une utilisation du réseau nettement moins importante. Cet aspect est primordial lors de la mise à jour d’un ensemble d’enregistrements, par exemple dans le cas d’une application Web de gestion d’annuaire.
Il est également judicieux de noter que les arguments d’entrée et de sortie d’une fonction développée en pl/pgSQL peuvent être polymorphes, c’est-à-dire qu’ils peuvent changer de type au fur et à mesure des appels de cette fonction.

Troisième point fondamental de l’utilisation de ce langage procédural : pl/pgSQL permet de séparer les différents éléments du code source du serveur d’application. En effet, le code source ne contient plus un ensemble de requêtes à traiter par le SGBD mais bien un ensemble d’appels de fonctions procédurales. Comme il s’avère facile de déléguer une partie des traitements habituellement effectués sur le serveur d’application par le SGBD grâce aux appels de fonctions, le serveur d’application présente les données tandis que le SGBD se contente de les gérer.

On assiste là à une véritable séparation des éléments d’une application, permettant de modifier chacun de ces éléments indépendamment des autres. Ceci constitue un véritable atout pour la gestion de pages html par exemple, répondant chacune à une demande particulière.
Dans le cas où l’on souhaiterait modifier certaines requêtes ou la base de données elle-même, il suffirait de confier cette tâche à un administrateur de SGBD sans avoir à modifier pour autant le code source de la page Web en question.

Enfin, le langage pl/pgSQL étant très similaire au langage pl/SQL d’Oracle, il est aisé de porter les fonctions écrites sur Oracle vers PostGreSQL, et ainsi, de rendre les procédures compatibles avec ces deux SGBD, mais ceci nécessite de prendre en compte certaines différences majeures entre ces deux langages.
En effet, d’un point de vue syntaxique, le langage pl/pgSQL n’est pas complètement compatible avec Oracle pour différentes raisons. On peut citer les différences suivantes :

- l’absence de valeurs par défaut pour les paramètres dans PostgGreSQL
- la possibilité de surcharge des fonctions dans PostGreSQL qui permet de palier le manque de paramètres par défaut
- l’absence de paramètres nommés lors des appels de fonctions dans PostGreSQL contrairement à Oracle : pour contourner ce problème, il suffit d’expliciter ces paramètres ou de créer des alias les désignant
- la délimitation des fonctions en PostGreSQL se faisant à l’aide de guillemets simples, il est nécessaire de doubler les guillemets provenant de caractères dans le corps des fonctions en pl/pgSQL
- d’autres syntaxes telles que RETURNS en pl/pgSQL contre RETURN en pl/SQL méritent également un traitement particulier

Il est donc important d’effectuer quelques modifications dans les codes avant de porter une fonction simple de pl/SQL vers pl/pgSQL et inversement.

Pour conclure, on peut également noter la possibilité de composer des procédures déclencheurs avec le langage pl/pgSQL exclusivement. Une telle procédure se crée naturellement grâce à la commande CREATE FUNCTION, toujours comme une fonction sans arguments ayant un type de retour trigger, et renvoyant forcément soit NULL soit une valeur record/ligne ayant la même structure que la table ayant engendré le déclencheur.

Lorsqu’une fonction pl/pgSQL de ce type est appelée en tant que trigger, plusieurs variables spéciales sont automatiquement crées. Une liste non exhaustive est la suivante :
- NEW (respectivement OLD) : Type de données RECORD ; variable contenant la nouvelle (respectivement l’ancienne) ligne de base de données pour les opérations INSERT/UPDATE dans les déclencheurs de niveau ligne. Cette variable est NULL dans un déclencheur de niveau instruction.
- TG_NAME : Type de données nom ; variable qui contient le nom du déclencheur réellement lancé.
- TG_OP : Type de données text ; une chaîne, INSERT, UPDATE ou DELETE, indiquant pour quelle opération le déclencheur a été lancé.
- TG_RELID : Type de données oid ; l’ID de l’objet de la table qui a causé le déclenchement.
- TG_RELNAME : Type de données nom ; le nom de la table qui a causé le déclenchement.
- TG_ARGV[ ] : Type de donnée text ; les arguments de l’instruction CREATE TRIGGER. L’index débute à 0.

De telles procédures permettent par exemple de s’assurer qu’à chaque fois qu’une ligne est insérée ou mise à jour dans une table donnée, le nom de l’utilisateur ainsi que la date courante sont inscrits dans cette même ligne.

SOURCES :

- XPOSE : Le PL/PGSQL.
- PL/pgSQL- Langage de procédures SQL. Chapitre 36 : PL/pgSQL- Langage de procédures SQL.
- Portage d’Oracle PL/SQL.
- Procédures déclencheur.