CodeGym /Corsi /SQL SELF /Confronto tra PL/pgSQL e altri linguaggi di programmazion...

Confronto tra PL/pgSQL e altri linguaggi di programmazione procedurale (PL/SQL, T-SQL)

SQL SELF
Livello 49, Lezione 2
Disponibile

Nel mondo dei database ci sono diversi linguaggi che estendono le capacità del normale SQL e ti permettono di scrivere vera logica di business direttamente dentro il DBMS. Ognuno di questi è pensato per la sua piattaforma, ma in generale risolvono problemi simili — automatizzare, semplificare e velocizzare il lavoro con i dati. Tra questi linguaggi ci sono PL/pgSQL per PostgreSQL, PL/SQL per Oracle e T-SQL per SQL Server. Ognuno ha le sue particolarità, vantaggi e sfumature, di cui parliamo ora.

PL/pgSQL (Procedural Language/PostgreSQL Structured Query Language) — è un linguaggio di programmazione procedurale integrato in PostgreSQL. Il suo scopo principale è estendere la funzionalità di SQL, dando agli sviluppatori la possibilità di lavorare con variabili, cicli, costrutti di controllo e blocchi di gestione degli errori. Questo rende il linguaggio uno strumento potente per implementare logica di business complessa lato database.

PL/SQL (Procedural Language/SQL) — linguaggio di programmazione procedurale integrato nel DBMS Oracle. Offre possibilità simili per la gestione dei dati e la creazione di procedure, funzioni e package. PL/SQL è considerato molto maturo grazie a decenni di affinamento e a un ricco ecosistema di strumenti.

T-SQL (Transact-SQL) — linguaggio sviluppato da Microsoft per lavorare con SQL Server. È un'estensione dello standard SQL che include il supporto per variabili, costrutti di controllo e altri elementi della programmazione procedurale. T-SQL ha le sue particolarità nella gestione delle transazioni, lavoro con i cursori e gestione di JSON.

Somiglianze tra PL/pgSQL, PL/SQL e T-SQL

A prima vista, tutti e tre i linguaggi sembrano abbastanza simili. E non è una sorpresa, visto che il loro scopo è lo stesso — aiutare lo sviluppatore a implementare la logica di business dentro il database. Vediamo le principali somiglianze:

  1. Sintassi dei blocchi

    Tutti e tre i linguaggi offrono un formato strutturato per scrivere codice procedurale. Gli elementi principali:

    • Dichiarazione delle variabili.
    • Blocco principale di esecuzione (BEGIN ... END).
    • Supporto per la gestione delle eccezioni.
  2. Variabili

    Puoi dichiarare e usare variabili in ognuno di questi linguaggi. Esempio di dichiarazione di una variabile in PL/pgSQL:

    DECLARE
        student_id INT;
    BEGIN
        student_id := 10;
    END;
    

    Lo stesso si può fare anche in PL/SQL e in T-SQL.

  3. Costrutti di controllo

    Tutti i linguaggi supportano IF...THEN, CASE, LOOP, FOR, WHILE, così puoi scrivere algoritmi complessi.

  4. Funzioni e procedure

    Possibilità di creare e chiamare funzioni e procedure personalizzate, che possono restituire sia valori singoli che tabelle.

Differenze tra PL/pgSQL, PL/SQL e T-SQL

Gli sviluppatori spesso si trovano in situazioni in cui devono passare da un database a un altro. In questi casi è importante conoscere le sfumature dei linguaggi. Vediamo le differenze chiave.

Dichiarazione delle variabili

PL/pgSQL: le variabili si dichiarano nel blocco DECLARE. Per assegnare valori si usa :=.

DECLARE
    total_students INT;
BEGIN
    total_students := 5;
END;

PL/SQL: la dichiarazione è simile a PL/pgSQL, ma il tipo della variabile può essere ereditato da una colonna di tabella usando %TYPE.

DECLARE
    student_name students.name%TYPE;
BEGIN
    student_name := 'John';
END;

T-SQL: le variabili si dichiarano con la parola chiave DECLARE, l'assegnazione — tramite SET o SELECT.

DECLARE @total_students INT;
SET @total_students = 5;  -- oppure
SELECT @total_students = COUNT(*) FROM students;

Gestione degli errori

PL/pgSQL: usa il blocco EXCEPTION per gestire gli errori. Per esempio:

BEGIN
    SELECT * INTO my_var FROM nonexistent_table;
EXCEPTION
    WHEN others THEN
        RAISE NOTICE 'Si è verificato un errore!';
END;

PL/SQL: usa anche EXCEPTION, ma con una classificazione degli errori più dettagliata.

BEGIN
    SELECT * INTO my_var FROM nonexistent_table;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('Nessun dato trovato!');
END;

T-SQL: usa i costrutti TRY...CATCH.

BEGIN TRY
    SELECT 1/0; -- Errore di divisione per zero
END TRY
BEGIN CATCH
    PRINT 'Si è verificato un errore!';
END CATCH;

Lavorare con i cursori

PL/pgSQL: i cursori sono impliciti e possono essere usati nei cicli.

FOR row IN SELECT * FROM students LOOP
    RAISE NOTICE 'Studente: %', row.name;
END LOOP;

PL/SQL: i cursori sono strutture dichiarate esplicitamente. Per esempio:

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: i cursori si dichiarano con la parola chiave CURSOR.

DECLARE student_cursor CURSOR FOR SELECT name FROM students;
OPEN student_cursor;
FETCH NEXT FROM student_cursor;
CLOSE student_cursor;
DEALLOCATE student_cursor;

Lavorare con le transazioni

PL/pgSQL: le transazioni si gestiscono con i comandi BEGIN, COMMIT, ROLLBACK.

PL/SQL: le transazioni si gestiscono allo stesso modo con COMMIT, ROLLBACK, con supporto per SAVEPOINT.

T-SQL: aggiunge il supporto per BEGIN TRANSACTION per indicare l'inizio di una transazione.

Supporto JSON

PL/pgSQL: lavoro potente con JSON tramite i tipi di dati JSON e JSONB. Esempio:

SELECT data->>'key' FROM json_table;

PL/SQL: il supporto JSON è arrivato più tardi ed è un po' meno flessibile.

T-SQL: lavoro molto comodo con JSON tramite le funzioni JSON_QUERY, JSON_VALUE.

Quando usare PL/pgSQL, PL/SQL o T-SQL?

PL/pgSQL:

  • La scelta è ovvia se il tuo database è PostgreSQL.
  • Perfetto per gestire grandi volumi di dati grazie al supporto di tipi di dati potenti (JSONB, array).
  • Ecosistema aperto, flessibilità.

PL/SQL:

  • La scelta per i prodotti Oracle.
  • Ecosistema ricco per lavorare con i dati (package, procedure integrate).

T-SQL:

  • Usato in Microsoft SQL Server.
  • Ideale per lavorare con applicazioni Microsoft e integrazione nello stack Microsoft Azure.

Esempio dello stesso task in PL/pgSQL, PL/SQL e T-SQL

Task: contare il numero di studenti e restituire il risultato

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;

Ora sai più o meno la differenza tra PL/pgSQL, PL/SQL e T-SQL. Ogni linguaggio ha le sue particolarità e scenari d'uso che lo rendono unico. La scelta del linguaggio (come anche del database) dipende sempre dalle tue esigenze e dalle specificità del progetto.

2
Compito
SQL SELF, livello 49, lezione 2
Bloccato
Creazione di una semplice funzione per contare le righe
Creazione di una semplice funzione per contare le righe
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION