CodeGym /Corsi /SQL SELF /Debug di PL/pgSQL tramite pgAdmin: breakpoints, visualizz...

Debug di PL/pgSQL tramite pgAdmin: breakpoints, visualizzazione delle variabili

SQL SELF
Livello 56 , Lezione 0
Disponibile

Allora, hai scritto la tua prima procedura o funzione, l’hai lanciata, ma qualcosa è andato storto. Certo, puoi aggiungere un sacco di RAISE NOTICE per capire dove esattamente “la nave si è incagliata”. Ma! Perché soffrire, se c’è pgAdmin con il debugger integrato?

pgAdmin ti permette di eseguire il codice passo-passo, impostare breakpoints, vedere i valori delle variabili e cercare le cause degli errori. È letteralmente il tuo “kit da detective” per indagare il mistero: “Perché la mia query non funziona?”.

Perché fare debug tramite pgAdmin?

A volte i bug interni delle procedure sono nascosti così in profondità che provare a capirli solo con i log o il testo nel terminale diventa una tortura. Ed è qui che il debug passo-passo ti salva, perché vedi tutto quello che succede a ogni step dell’esecuzione della funzione. Immagina di dover risolvere un puzzle super difficile, ma con gli indizi.

Con il debug in pgAdmin puoi:

  1. Impostare breakpoints — sono punti dove l’esecuzione del codice si ferma, così puoi analizzare lo stato attuale.
  2. Andare passo-passo nel codice SQL — letteralmente vedere, riga per riga, quale istruzione viene eseguita.
  3. Vedere i valori delle variabili in tempo reale — assicurarti che i dati vengano passati e gestiti correttamente.
  4. Trovare il punto dove si è verificato l’errore e capirne la causa.

Come iniziare: preparazione al debug in pgAdmin

Prima di partire con il debug, assicuriamoci che tutto sia configurato come si deve.

Abilitare l’estensione plpgsql

Assicurati che nella tua base dati sia abilitato il linguaggio PL/pgSQL:

CREATE EXTENSION IF NOT EXISTS plpgsql;

Di solito questo linguaggio è attivo di default in PostgreSQL, ma meglio controllare.

Assicurati di avere installato pgAdmin versione 4 o superiore (supporta il debug). Se non ce l’hai ancora, puoi scaricare pgAdmin dal sito ufficiale.

Installare l’estensione pldbgapi

Per abilitare il debug di PL/pgSQL in pgAdmin, devi attivare l’estensione pldbgapi:

CREATE EXTENSION IF NOT EXISTS pldbgapi;

Questa estensione è fatta apposta per interagire col debugger.

Molto importante!!! Assicurati di avere i permessi da admin sul server PostgreSQL per eseguire questa query.

Basi del debug: impostare i breakpoints

I breakpoints sono punti speciali nel codice dove l’esecuzione della procedura o funzione si ferma, così puoi dare un’occhiata dentro al processo. È come una pausa durante un lungo viaggio: ti fermi, dai un’occhiata alla mappa, poi riparti.

Come impostare un breakpoint in pgAdmin?

  1. Apri pgAdmin e connettiti al tuo database.
  2. Trova la tua funzione o procedura nell’albero degli oggetti: Functions<la tua schema><la tua funzione>.
  3. Fai clic destro sulla funzione e scegli Debugging → Debug. Questo avvia il debugger.
  4. Nella finestra che si apre col codice della funzione, trova la riga da cui vuoi iniziare il debug e clicca a sinistra della riga. Vedrai un cerchio rosso — quello è il breakpoint.

Ecco come appare:

CREATE OR REPLACE FUNCTION example_function(id INTEGER)
RETURNS VOID AS $$
BEGIN
    RAISE NOTICE 'Hai scelto id: %', id;
    -- Qui puoi mettere un breakpoint
    PERFORM some_operation(id);
END;
$$ LANGUAGE plpgsql;

Dopo che hai messo il breakpoint, puoi lanciare la funzione e l’esecuzione si fermerà proprio lì. Ora puoi controllare i valori delle variabili, i risultati delle istruzioni precedenti e, ovviamente, continuare l’esecuzione del codice.

Visualizzare le variabili in pgAdmin

Sapere che il tuo codice si è fermato è già qualcosa. Ma è molto più utile capire quali dati ci sono in memoria in quel momento. Per esempio:

  • Quali valori hanno i parametri in ingresso.
  • Come sono cambiate le variabili dopo un certo blocco.
  • Cosa ha restituito la query al database.

Come vedere i valori delle variabili?

Quando l’esecuzione della funzione si ferma su un breakpoint:

  1. Vai sulla tab Variables in basso nella finestra del debugger.
  2. Qui vedrai la lista di tutte le variabili e i loro valori attuali.

Supponiamo di avere questa funzione:

CREATE OR REPLACE FUNCTION calculate_discount(price NUMERIC, discount NUMERIC)
RETURNS NUMERIC AS $$
DECLARE
    discounted_price NUMERIC;
BEGIN
    discounted_price := price - (price * discount / 100);
    RETURN discounted_price;
END;
$$ LANGUAGE plpgsql;

Se metti un breakpoint sulla riga con discounted_price, il debugger mostrerà che le variabili price e discount hanno già un valore, ma discounted_price è ancora vuota.

Ecco come appare la lista delle variabili dopo lo stop:

Variabile Valore
price 100.00
discount 15.00
discounted_price NULL

Dopo che esegui la riga corrente, discounted_price diventa 85.00.

Esecuzione passo-passo del codice

Nella finestra del debugger puoi controllare l’esecuzione della funzione con i pulsanti:

  1. Step Over — esegue l’istruzione corrente e passa alla successiva.
  2. Step Into — ti permette di “entrare” nella funzione o procedura chiamata.
  3. Continue — continua l’esecuzione fino al prossimo breakpoint o fino alla fine.

Applicazione pratica: debug di funzioni complesse

Dai, proviamo a scrivere e debuggare una funzione un po’ più tosta.

Esempio: gestione degli ordini

CREATE OR REPLACE FUNCTION process_order(order_id INTEGER)
RETURNS TEXT AS $$
DECLARE
    order_status TEXT;
    total_amount NUMERIC;
BEGIN
    -- Impostiamo lo stato dell’ordine
    SELECT status INTO order_status
    FROM orders
    WHERE id = order_id;

    IF order_status = 'Pending' THEN
        -- Calcoliamo il totale dell’ordine
        SELECT SUM(price * quantity) INTO total_amount
        FROM order_items
        WHERE order_id = order_id;

        -- Aggiorniamo lo stato dell’ordine
        UPDATE orders
        SET status = 'Processed', processed_date = NOW()
        WHERE id = order_id;

        RETURN 'Ordine processato. Totale: ' || total_amount;
    ELSE
        RETURN 'Ordine già processato o non esiste.';
    END IF;
END;
$$ LANGUAGE plpgsql;

Punti dove puoi mettere i breakpoints:

  1. Sulla riga SELECT status INTO order_status.
  2. Sulla riga SELECT SUM(price * quantity) INTO total_amount.

Durante il debug puoi:

  • Assicurarti che order_status abbia davvero il valore 'Pending'.
  • Controllare che total_amount venga calcolato giusto.

Errori comuni e come risolverli

Durante il debug con pgAdmin potresti trovarti in queste situazioni:

  1. Non vedi la tua funzione nella lista. Assicurati che la funzione sia davvero creata nel database e che tu sia connesso al database giusto.
  1. I breakpoints non funzionano. Controlla che l’estensione pldbgapi sia attiva e che tu abbia i permessi necessari.

  2. Errore di connessione al debugger. Assicurati che il server PostgreSQL sia configurato per il debug (il parametro shared_preload_libraries deve includere pldbgapi).

Usare pgAdmin per il debug di PL/pgSQL rende il processo super semplice e intuitivo. Metti un breakpoint, guarda cosa “respirano” le tue variabili e sistema tutti i problemi — sei già a metà strada verso la tua app perfetta!

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