CodeGym /Cours /SQL SELF /Comparaison de PL/pgSQL avec d'autres langages de program...

Comparaison de PL/pgSQL avec d'autres langages de programmation procédurale (PL/SQL, T-SQL)

SQL SELF
Niveau 49 , Leçon 2
Disponible

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 :

  1. 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.
  2. 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.

  3. Structures de contrôle

    Les trois langages supportent IF...THEN, CASE, LOOP, FOR, WHILE, ce qui permet d'écrire des algos bien costauds.

  4. 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.

Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION