Então, você escreveu seu primeiro procedure ou função, rodou ela, mas alguma coisa deu ruim. Claro, você pode encher o código de RAISE NOTICE pra tentar sacar onde o "navio encalhou". Mas, fala sério! Pra que sofrer, se o pgAdmin já tem um debugger embutido?
O pgAdmin deixa você rodar o código passo a passo, colocar breakpoints, ver valores das variáveis e caçar os motivos dos erros. É tipo um "kit de detetive" pra investigar o mistério: "Por que minha query não tá funcionando?".
Por que usar o debug do pgAdmin?
Às vezes, os bugs dentro dos procedures estão tão escondidos que tentar entender só com logs ou texto no terminal vira um sofrimento. É aí que o debug passo a passo salva, porque você vê tudo que tá rolando em cada etapa da função. Imagina montar um quebra-cabeça difícil, mas com dicas.
Com o debug do pgAdmin você pode:
- Colocar breakpoints — são pontos onde a execução do código para, pra você analisar o estado atual.
- Passar pelo código SQL passo a passo — literalmente vendo cada comando sendo executado.
- Ver valores das variáveis em tempo real — garantir que os dados estão sendo passados e processados certinho.
- Achar onde rolou o erro e entender o motivo.
Como começar: preparando o debug no pgAdmin
Antes de começar a debugar, bora garantir que tá tudo configurado certinho.
Ativando a extensão plpgsql
Confere se o PL/pgSQL tá ativado no seu banco de dados:
CREATE EXTENSION IF NOT EXISTS plpgsql;
Esse idioma geralmente já vem ativado no PostgreSQL, mas é bom checar.
Confere também se você tá usando o pgAdmin versão 4 ou superior (ele que suporta o debug). Se ainda não tem, pode baixar o pgAdmin no site oficial.
Instalando a extensão pldbgapi
Pra liberar o debug de PL/pgSQL no pgAdmin, você precisa ativar a extensão pldbgapi:
CREATE EXTENSION IF NOT EXISTS pldbgapi;
Essa extensão foi feita especialmente pra trabalhar com o debugger.
Muito importante!!! Confere se você tem permissão de admin no servidor PostgreSQL pra rodar esse comando.
O básico do debug: colocando breakpoints
Breakpoints são pontos especiais no código onde a execução do procedure ou função para, pra você dar aquela olhada no que tá rolando. É tipo uma paradinha na estrada: você para, olha o mapa, confere o caminho e segue viagem.
Como colocar um breakpoint no pgAdmin?
- Abre o pgAdmin e conecta no seu banco de dados.
- Acha sua função ou procedure na árvore de objetos: Functions → <sua schema> → <sua função>.
- Clica com o botão direito na função e escolhe Debugging → Debug. Isso vai abrir o debugger.
- No código da função que abrir, acha a linha onde você quer começar o debug e clica na barrinha à esquerda da linha. Vai aparecer um círculo vermelho — esse é o breakpoint.
Olha só como fica:
CREATE OR REPLACE FUNCTION example_function(id INTEGER)
RETURNS VOID AS $$
BEGIN
RAISE NOTICE 'Você escolheu id: %', id;
-- Aqui dá pra colocar um breakpoint
PERFORM some_operation(id);
END;
$$ LANGUAGE plpgsql;
Depois que o breakpoint tá no lugar, você pode rodar sua função e a execução vai parar exatamente ali. Aí dá pra conferir os valores das variáveis, o resultado dos comandos anteriores e, claro, continuar rodando o código.
Visualizando variáveis no pgAdmin
Saber que o código parou é legal. Mas melhor ainda é sacar quais dados tão na memória naquele momento. Por exemplo:
- Quais valores os parâmetros de entrada têm.
- Como as variáveis mudaram depois de um bloco específico.
- O que a query retornou do banco.
Como ver os valores das variáveis?
Quando a execução da função para no breakpoint:
- Vai na aba Variables na parte de baixo da janela do debugger.
- Lá você vê a lista de todas as variáveis e os valores atuais delas.
Imagina que temos essa função:
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 você colocar um breakpoint na linha do discounted_price, o debugger mostra que as variáveis price e discount já têm valor, mas discounted_price ainda tá vazia.
Assim fica a lista de variáveis depois da parada:
| Variável | Valor |
|---|---|
price |
100.00 |
discount |
15.00 |
discounted_price |
NULL |
Depois que você rodar a linha atual, discounted_price vira 85.00.
Executando o código passo a passo
No debugger, você controla a execução da função com esses botões:
- Step Over — executa o comando atual e vai pro próximo.
- Step Into — entra na função ou procedure chamada.
- Continue — continua a execução até o próximo breakpoint ou até terminar.
Na prática: debugando funções mais complexas
Bora tentar escrever e debugar uma função mais elaborada.
Exemplo: processamento de pedidos
CREATE OR REPLACE FUNCTION process_order(order_id INTEGER)
RETURNS TEXT AS $$
DECLARE
order_status TEXT;
total_amount NUMERIC;
BEGIN
-- Definindo o status do pedido
SELECT status INTO order_status
FROM orders
WHERE id = order_id;
IF order_status = 'Pending' THEN
-- Calculando o valor total do pedido
SELECT SUM(price * quantity) INTO total_amount
FROM order_items
WHERE order_id = order_id;
-- Atualizando o status do pedido
UPDATE orders
SET status = 'Processed', processed_date = NOW()
WHERE id = order_id;
RETURN 'Pedido processado. Valor: ' || total_amount;
ELSE
RETURN 'Pedido já processado ou não existe.';
END IF;
END;
$$ LANGUAGE plpgsql;
Possíveis breakpoints:
- Na linha
SELECT status INTO order_status. - Na linha
SELECT SUM(price * quantity) INTO total_amount.
No debug, dá pra:
- Conferir se
order_statusrealmente tá com valor'Pending'. - Ver se
total_amounttá sendo calculado certinho.
Erros comuns e como resolver
No debug pelo pgAdmin, você pode topar com essas situações:
- Não acha sua função na lista. Confere se a função foi criada mesmo no banco e se você tá conectado no banco certo.
Breakpoints não funcionam. Vê se a extensão
pldbgapitá ativada e se você tem as permissões necessárias.Erro de conexão do debugger. Confere se o servidor PostgreSQL tá configurado pro debug (o parâmetro
shared_preload_librariesincluipldbgapi).
Usar o pgAdmin pra debugar PL/pgSQL deixa tudo muito mais fácil e intuitivo. Coloca um breakpoint, vê como estão suas variáveis e resolve os bugs — isso já é metade do caminho pro seu app ficar redondinho!
GO TO FULL VERSION