In questa lezione vediamo quali tipi di dati sono supportati in PL/pgSQL e impariamo a lavorarci in modo efficace. Ci concentriamo su quattro tipi di dati:
INTEGERper lavorare con i numeri.TEXTper gestire le stringhe.BOOLEANper lavorare con valori logici.RECORDper gestire strutture dati dinamiche.
Vedremo ogni tipo di dato con degli esempi, così puoi capire come usarli nella pratica.
Tipi di dati supportati in PL/pgSQL
PL/pgSQL supporta tutti i tipi di dati che già conosci da PostgreSQL. Dai semplici numerici (INTEGER, NUMERIC) a quelli più avanzati come array e JSONB. Facciamo una panoramica dei principali.
Tipi primitivi:
INTEGER,BIGINT,FLOAT,NUMERIC— tipi numerici.TEXT,CHAR,VARCHAR— tipi testuali.BOOLEAN— tipo di dato logico.
Tipi complessi:
RECORD— per lavorare con set di dati dinamici.ROWTYPE— per lavorare con tipi di riga di una tabella.- Array e JSON — li vedremo più avanti nel corso.
Lavorare con il tipo INTEGER
INTEGER è uno dei tipi di dati più usati. Serve per salvare numeri interi. In PL/pgSQL puoi usarlo per fare calcoli, lavorare con gli ID dei record e controllare condizioni.
Esempio: conteggio del numero di record
Supponiamo di avere una tabella students e vogliamo sapere quanti studenti ci sono nel database.
DO $$
DECLARE
total_students INTEGER; -- Variabile per salvare il numero di studenti
BEGIN
SELECT COUNT(*) INTO total_students FROM students; -- Salviamo il risultato della query nella variabile
RAISE NOTICE 'Numero di studenti: %', total_students; -- Mostriamo il messaggio
END;
$$;
Cose importanti quando lavori con INTEGER:
- In PL/pgSQL assegni un valore a una variabile usando la parola chiave
INTO. - Se provi a salvare un valore decimale in
INTEGER, otterrai un errore. In questi casi usaNUMERICoFLOAT.
Lavorare con il tipo TEXT
TEXT serve per salvare dati testuali. Ti sarà utile quando devi lavorare con nomi, descrizioni o qualsiasi altro testo.
Esempio: mostrare i nomi degli studenti
In questo esempio mostriamo i nomi di tutti gli studenti dalla tabella students.
DO $$
DECLARE
student_name TEXT; -- Variabile per il nome dello studente
BEGIN
FOR student_name IN SELECT name FROM students LOOP
RAISE NOTICE 'Nome dello studente: %', student_name; -- Mostriamo ogni nome
END LOOP;
END;
$$;
Funzioni utili per lavorare con TEXT:
UPPER()eLOWER()— per cambiare il testo in maiuscolo/minuscolo.CONCAT()— per unire le stringhe.LENGTH()— per sapere la lunghezza della stringa.
Per esempio:
DO $$
DECLARE
full_name TEXT;
BEGIN
full_name := CONCAT('Alekse', ' Min'); -- Uniamo le stringhe
RAISE NOTICE 'Nome completo: %', UPPER(full_name); -- Stampiamo il nome in maiuscolo
END;
$$;
Lavorare con il tipo BOOLEAN
BOOLEAN serve per salvare valori logici: TRUE, FALSE e NULL. Questo tipo di dato è super utile quando devi controllare condizioni o filtrare dati.
Esempio: controllo dell’attività dello studente
Supponiamo che tu abbia una tabella students con una colonna is_active che indica se lo studente è attivo.
DO $$
DECLARE
is_active BOOLEAN; -- Variabile per salvare lo stato di attività
BEGIN
SELECT is_active INTO is_active FROM students WHERE id = 1; -- Prendiamo il valore dalla tabella
IF is_active THEN
RAISE NOTICE 'Lo studente è attivo!';
ELSE
RAISE NOTICE 'Lo studente NON è attivo.';
END IF;
END;
$$;
Cose importanti quando lavori con BOOLEAN:
- I valori logici puoi usarli direttamente nelle condizioni
IFeWHILE. - Il valore
NULLnella logica è "indefinito", quindi tienilo a mente quando fai i controlli.
Lavorare con il tipo RECORD
RECORD è un tipo di dato super potente che serve per salvare righe di dati senza una struttura predefinita. È molto utile quando lavori con i risultati delle query SQL che restituiscono più colonne.
Esempio: scorrere tutte le righe della tabella
Nell’esempio qui sotto scorriamo tutte le righe della tabella students e mostriamo il nome e l’ID di ogni studente.
DO $$
DECLARE
student RECORD; -- Tipo dinamico per salvare una riga di dati
BEGIN
FOR student IN SELECT id, name FROM students LOOP
RAISE NOTICE 'ID: %, Nome: %', student.id, student.name; -- Accediamo alle colonne della riga
END LOOP;
END;
$$;
Cose importanti quando lavori con RECORD:
- Le variabili di tipo
RECORDsi riempiono solo dentro un ciclo o usando una querySELECT INTO. - Per accedere alle colonne usa
record.nome_colonna.
Tipi di dati ROWTYPE per lavorare con le tabelle
Se vuoi salvare una riga intera di una tabella (e vuoi una tipizzazione precisa), puoi usare il tipo ROWTYPE. Prende automaticamente la struttura della riga dalla tabella.
Esempio: lavorare con il tipo ROWTYPE
DO $$
DECLARE
student students%ROWTYPE; -- Variabile con la struttura della riga della tabella students
BEGIN
SELECT * INTO student FROM students WHERE id = 1; -- Carichiamo i dati della riga nella variabile
RAISE NOTICE 'Nome dello studente: %, Corso: %', student.name, student.course;
END;
$$;
Differenze tra RECORD e ROWTYPE
| Caratteristica | RECORD | ROWTYPE |
|---|---|---|
| Struttura delle colonne | Non definita in anticipo | Dipende dalla tabella o dalla query |
| Utilizzo | Flessibilità per qualsiasi risultato | Legato rigidamente alla struttura |
Esempio pratico
Scriviamo una funzione che restituisce il numero di studenti attivi e i loro nomi.
CREATE FUNCTION active_students_report() RETURNS TABLE(id INT, name TEXT) AS $$
BEGIN
RETURN QUERY
SELECT id, name FROM students WHERE is_active = TRUE;
END;
$$ LANGUAGE plpgsql;
Chiamata della funzione:
SELECT * FROM active_students_report();
Errori quando lavori con i tipi di dati
A volte lavorare con i dati porta a errori. Ecco alcune situazioni comuni:
- Errore di tipo: provi a salvare una stringa in una variabile
INTEGER(tipomy_var := 'abc';). - Usi
NULLdove ti aspettiTRUEoFALSE. - Usi
RECORDsenza inizializzarlo correttamente.
Come evitare errori:
- Dichiara sempre esplicitamente il tipo delle variabili.
- Controlla i tipi di dati delle colonne nelle tabelle prima di scrivere.
- Usa i comandi di debug come
RAISE NOTICE.
Ora sai come lavorare con i tipi di dati INTEGER, TEXT, BOOLEAN e RECORD in PL/pgSQL. Questa conoscenza ti permetterà di creare programmi più complessi e potenti nel linguaggio di programmazione procedurale di PostgreSQL.
GO TO FULL VERSION