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:
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.
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.
Costrutti di controllo
Tutti i linguaggi supportano
IF...THEN,CASE,LOOP,FOR,WHILE, così puoi scrivere algoritmi complessi.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.
GO TO FULL VERSION