Dans le monde des bases de données, il existe plusieurs langages qui étendent les possibilités du SQL classique et permettent d'écrire de la vraie logique métier directement dans le SGBD. Chacun est taillé pour sa propre plateforme, mais au final ils servent tous à peu près à la même chose : automatiser, simplifier et accélérer le boulot avec les données. Parmi ces langages, on trouve PL/pgSQL pour PostgreSQL, PL/SQL pour Oracle et T-SQL pour SQL Server. Chacun a ses propres particularités, avantages et subtilités, et c'est justement ce dont on va parler maintenant.
PL/pgSQL (Procedural Language/PostgreSQL Structured Query Language) — c'est un langage procédural intégré à PostgreSQL. Son but principal, c'est d'étendre les fonctionnalités de SQL en donnant aux devs la possibilité de bosser avec des variables, des boucles, des structures de contrôle et des blocs de gestion d'erreurs. Ça en fait un outil super puissant pour implémenter de la logique métier complexe côté base de données.
PL/SQL (Procedural Language/SQL) — c'est le langage procédural intégré dans Oracle. Il offre des possibilités similaires pour manipuler les données et créer des procédures, fonctions et packages. PL/SQL est considéré comme un langage très mature grâce à des décennies d'améliorations et à un écosystème d'outils bien fourni.
T-SQL (Transact-SQL) — c'est le langage développé par Microsoft pour SQL Server. C'est une extension du SQL standard, avec le support des variables, des structures de contrôle et d'autres éléments de la programmation procédurale. T-SQL a ses propres particularités pour les transactions, les curseurs et la gestion du JSON.
Similarités entre PL/pgSQL, PL/SQL et T-SQL
À première vue, ces trois langages se ressemblent pas mal. Et c'est normal, vu qu'ils servent tous à la même chose : aider le dev à implémenter la logique métier dans la base de données. Voyons les points communs principaux :
Syntaxe des blocs
Les trois langages proposent un format structuré pour écrire du code procédural. Les éléments principaux :
- Déclaration de variables.
- Bloc principal d'exécution (
BEGIN ... END). - Support de la gestion des exceptions.
Variables
Tu peux déclarer et utiliser des variables dans chacun de ces langages. Exemple de déclaration de variable en PL/pgSQL :
DECLARE student_id INT; BEGIN student_id := 10; END;Tu peux faire pareil en PL/SQL et en T-SQL.
Structures de contrôle
Les trois langages supportent
IF...THEN,CASE,LOOP,FOR,WHILE, ce qui permet d'écrire des algos bien costauds.Fonctions et procédures
Tu peux créer et appeler des fonctions et procédures custom, qui peuvent renvoyer soit des valeurs simples, soit des tables entières.
Différences entre PL/pgSQL, PL/SQL et T-SQL
Les devs tombent souvent sur des situations où il faut passer d'une base à une autre. Dans ces cas-là, c'est important de connaître les subtilités des langages. On va voir les différences clés.
Déclaration de variables
PL/pgSQL : les variables se déclarent dans le bloc DECLARE. Pour assigner une valeur, on utilise :=.
DECLARE
total_students INT;
BEGIN
total_students := 5;
END;
PL/SQL : la déclaration est similaire à PL/pgSQL, mais le type de la variable peut être hérité d'une colonne de table avec %TYPE.
DECLARE
student_name students.name%TYPE;
BEGIN
student_name := 'John';
END;
T-SQL : les variables se déclarent avec le mot-clé DECLARE, et l'assignation se fait avec SET ou SELECT.
DECLARE @total_students INT;
SET @total_students = 5; -- ou bien
SELECT @total_students = COUNT(*) FROM students;
Gestion des erreurs
PL/pgSQL : utilise le bloc EXCEPTION pour gérer les erreurs. Par exemple :
BEGIN
SELECT * INTO my_var FROM nonexistent_table;
EXCEPTION
WHEN others THEN
RAISE NOTICE 'Une erreur est survenue !';
END;
PL/SQL : utilise aussi EXCEPTION, mais avec une classification des erreurs plus détaillée.
BEGIN
SELECT * INTO my_var FROM nonexistent_table;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Aucune donnée trouvée !');
END;
T-SQL : utilise les blocs TRY...CATCH.
BEGIN TRY
SELECT 1/0; -- Erreur de division par zéro
END TRY
BEGIN CATCH
PRINT 'Une erreur est survenue !';
END CATCH;
Boulot avec les curseurs
PL/pgSQL : les curseurs sont implicites et peuvent être utilisés dans les boucles.
FOR row IN SELECT * FROM students LOOP
RAISE NOTICE 'Étudiant : %', row.name;
END LOOP;
PL/SQL : les curseurs sont des structures déclarées explicitement. Par exemple :
DECLARE
CURSOR student_cursor IS SELECT * FROM students;
student_row students%ROWTYPE;
BEGIN
OPEN student_cursor;
FETCH student_cursor INTO student_row;
CLOSE student_cursor;
END;
T-SQL : les curseurs se déclarent avec le mot-clé CURSOR.
DECLARE student_cursor CURSOR FOR SELECT name FROM students;
OPEN student_cursor;
FETCH NEXT FROM student_cursor;
CLOSE student_cursor;
DEALLOCATE student_cursor;
Gestion des transactions
PL/pgSQL : les transactions sont gérées avec les commandes BEGIN, COMMIT, ROLLBACK.
PL/SQL : les transactions sont aussi gérées avec COMMIT, ROLLBACK, et il y a le support de SAVEPOINT.
T-SQL : il y a en plus le support de BEGIN TRANSACTION pour marquer le début d'une transaction.
Support du JSON
PL/pgSQL : gestion puissante du JSON via les types JSON et JSONB. Exemple :
SELECT data->>'clé' FROM json_table;
PL/SQL : le support du JSON est arrivé plus tard et il est un peu moins flexible.
T-SQL : gestion très pratique du JSON avec les fonctions JSON_QUERY, JSON_VALUE.
Quand utiliser PL/pgSQL, PL/SQL ou T-SQL ?
PL/pgSQL :
- Le choix évident si ta base de données, c'est PostgreSQL.
- Super pour traiter de gros volumes de données grâce au support de types puissants (
JSONB, tableaux). - Écosystème ouvert, flexible.
PL/SQL :
- Le choix pour les produits Oracle.
- Écosystème riche pour bosser avec les données (packages, procédures intégrées).
T-SQL :
- Utilisé dans Microsoft SQL Server.
- Parfait pour bosser avec les applis Microsoft et s'intégrer dans la stack Microsoft Azure.
Exemple de la même tâche en PL/pgSQL, PL/SQL et T-SQL
Tâche : compter le nombre d'étudiants et renvoyer le résultat
PL/pgSQL :
CREATE FUNCTION count_students() RETURNS INT AS $$
DECLARE
total INT;
BEGIN
SELECT COUNT(*) INTO total FROM students;
RETURN total;
END;
$$ LANGUAGE plpgsql;
PL/SQL :
CREATE OR REPLACE FUNCTION count_students RETURN NUMBER IS
total NUMBER;
BEGIN
SELECT COUNT(*) INTO total FROM students;
RETURN total;
END;
T-SQL :
CREATE FUNCTION count_students()
RETURNS INT
AS
BEGIN
DECLARE @total INT;
SELECT @total = COUNT(*) FROM students;
RETURN @total;
END;
Maintenant tu connais à peu près la différence entre PL/pgSQL, PL/SQL et T-SQL. Chaque langage a ses propres particularités et cas d'utilisation qui le rendent unique. Le choix du langage (et de la base de données) dépend toujours de tes besoins et des spécificités de ton projet.
GO TO FULL VERSION