Logar é o processo de registrar eventos importantes e informações sobre como o app ou o banco de dados tá rodando. No PL/pgSQL isso é especialmente útil quando tu tá criando funções mais complexas, que chamam outras funções, trabalham com triggers ou fazem vários passos. Olha só alguns motivos chave pra logar:
- Debugando o código: logar te ajuda a entender o que tá rolando em cada etapa da execução da função.
- Diagnóstico de problemas: se a função não tá funcionando como tu esperava, os logs vão te mostrar onde quebrou.
- Análise da execução: sabendo quais passos foram feitos (e em qual ordem), tu consegue otimizar a performance ou achar pontos pra melhorar.
- Facilidade na manutenção: imagina que daqui um ano tu abre tua função e não entende mais nada do que fez (e isso vai acontecer, acredita). Os logs salvam nessas horas.
RAISE NOTICE — a base do logging
Se tu já programa e usou print() ou console.log() pra debugar, o RAISE NOTICE é tipo o irmão mais velho deles no mundo do PostgreSQL. É um comando que mostra mensagens informativas enquanto a função roda. Essas mensagens aparecem no console, terminal ou na interface onde tu executa tua query.
Sintaxe do RAISE NOTICE
RAISE NOTICE 'Mensagem de execução';
Mas isso é só o começo. Tu pode colocar variáveis nas tuas mensagens pra deixar elas mais informativas:
RAISE NOTICE 'Valor atual da variável: %', my_variable;
Aqui o % é um placeholder, e my_variable é a variável que tu quer mostrar o valor.
Se tu quiser mostrar várias variáveis, faz assim:
RAISE NOTICE 'Valores: % e %', var1, var2;
Exemplos de uso do RAISE NOTICE
1. Mostrando o valor de uma variável. Vamos declarar uma variável numa função e mostrar o valor dela usando RAISE NOTICE.
CREATE OR REPLACE FUNCTION debug_variable_example()
RETURNS VOID AS $$
DECLARE
my_variable INTEGER := 42;
BEGIN
RAISE NOTICE 'Valor da variável my_variable: %', my_variable;
END;
$$ LANGUAGE plpgsql;
Quando tu chamar essa função:
SELECT debug_variable_example();
No resultado tu vai ver algo tipo:
NOTICE: Valor da variável my_variable: 42
2. Logando os passos da execução. Imagina que tu tem uma função que precisa fazer vários passos. Tu pode colocar RAISE NOTICE depois de cada ação pra garantir que tá tudo indo conforme o esperado.
CREATE OR REPLACE FUNCTION process_data()
RETURNS VOID AS $$
BEGIN
RAISE NOTICE 'Passo 1: início do processo';
-- Aqui rola algum código SQL
PERFORM pg_sleep(1); -- Simulando uma operação
RAISE NOTICE 'Passo 2: processo continua';
-- Mais um pouco de SQL
PERFORM pg_sleep(1); -- Simulando uma operação
RAISE NOTICE 'Passo 3: processo finalizado';
END;
$$ LANGUAGE plpgsql;
Chamando a função:
SELECT process_data();
Tu vai receber:
NOTICE: Passo 1: início do processo
NOTICE: Passo 2: processo continua
NOTICE: Passo 3: processo finalizado
Agora tu sempre sabe em que etapa tá a execução.
Aplicação prática
Bora ver um exemplo de logando cálculos. Vamos criar uma função que calcula a soma dos números de 1 até N e loga o processo:
CREATE OR REPLACE FUNCTION sum_with_logging(n INTEGER)
RETURNS INTEGER AS $$
DECLARE
total INTEGER := 0;
i INTEGER;
BEGIN
RAISE NOTICE 'Início dos cálculos para n = %', n;
FOR i IN 1..n LOOP
total := total + i;
RAISE NOTICE 'Soma no passo %: %', i, total;
END LOOP;
RAISE NOTICE 'Resultado dos cálculos: %', total;
RETURN total;
END;
$$ LANGUAGE plpgsql;
Chamando essa função com o parâmetro 5:
SELECT sum_with_logging(5);
Tu vai ver:
NOTICE: Início dos cálculos para n = 5
NOTICE: Soma no passo 1: 1
NOTICE: Soma no passo 2: 3
NOTICE: Soma no passo 3: 6
NOTICE: Soma no passo 4: 10
NOTICE: Soma no passo 5: 15
NOTICE: Resultado dos cálculos: 15
Dicas úteis pra logar
- Remove os logs desnecessários: quando tua função já tá pronta e funcionando, tira as mensagens
RAISE NOTICEque não precisa mais, pra não poluir o terminal ou a interface do usuário. - Usa mensagens que façam sentido: não coloca só "Passo 1", "Passo 2". Explica o que tá rolando em cada passo.
- Cuidado com informações sensíveis: nunca coloca nos logs dados de cartão de crédito, senhas ou qualquer informação confidencial.
GO TO FULL VERSION