CodeGym /Cursos /SQL SELF /Debugando PL/pgSQL pelo pgAdmin: breakpoints, visualizaçã...

Debugando PL/pgSQL pelo pgAdmin: breakpoints, visualização de variáveis

SQL SELF
Nível 56, Lição 0
Disponível

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:

  1. Colocar breakpoints — são pontos onde a execução do código para, pra você analisar o estado atual.
  2. Passar pelo código SQL passo a passo — literalmente vendo cada comando sendo executado.
  3. Ver valores das variáveis em tempo real — garantir que os dados estão sendo passados e processados certinho.
  4. 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?

  1. Abre o pgAdmin e conecta no seu banco de dados.
  2. Acha sua função ou procedure na árvore de objetos: Functions → <sua schema> → <sua função>.
  3. Clica com o botão direito na função e escolhe Debugging → Debug. Isso vai abrir o debugger.
  4. 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:

  1. Vai na aba Variables na parte de baixo da janela do debugger.
  2. 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:

  1. Step Over — executa o comando atual e vai pro próximo.
  2. Step Into — entra na função ou procedure chamada.
  3. 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:

  1. Na linha SELECT status INTO order_status.
  2. Na linha SELECT SUM(price * quantity) INTO total_amount.

No debug, dá pra:

  • Conferir se order_status realmente tá com valor 'Pending'.
  • Ver se total_amount tá sendo calculado certinho.

Erros comuns e como resolver

No debug pelo pgAdmin, você pode topar com essas situações:

  1. 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.
  1. Breakpoints não funcionam. Vê se a extensão pldbgapi tá ativada e se você tem as permissões necessárias.

  2. Erro de conexão do debugger. Confere se o servidor PostgreSQL tá configurado pro debug (o parâmetro shared_preload_libraries inclui pldbgapi).

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!

2
Tarefa
SQL SELF, nível 56, lição 0
Bloqueado
Depuração de função com múltiplas variáveis
Depuração de função com múltiplas variáveis
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION