Quando você tá lidando com bancos de dados pequenos, não tem problema rodar consultas ou procedures manualmente pra montar relatórios. Mas no mundo real, os bancos crescem tanto que qualquer tarefa repetitiva precisa ser automatizada. Imagina que todo dia te pedem um relatório de vendas. Mesmo que a consulta leve só dois minutos, em um ano você vai gastar mais de 12 horas só nisso. Melhor gastar esse tempo tomando um café enquanto a procedure automática faz tudo pra você.
Automatizar ajuda a:
- Reduzir trabalho manual.
- Garantir que os relatórios saiam sempre no tempo certo (tipo, diário, semanal...)
- Minimizar chance de erro humano.
- Aumentar a confiança nos seus relatórios: eles sempre são criados com os parâmetros certos.
Passos principais pra gerar relatórios automaticamente
Rodar relatórios de forma automática envolve esses passos:
- Criar uma procedure em PL/pgSQL que gera o relatório.
- Configurar o log dos resultados (se precisar).
- Usar um planejador de tarefas pra rodar a procedure no horário certo.
Bora fazer isso passo a passo!
Criando uma procedure pra gerar o relatório
Pra começar, vamos criar uma procedure simples que calcula o total de vendas de todos os pedidos do dia e salva o resultado numa tabela de logs. Nossa tabela de log já existe (vamos chamar de sales_report_log):
CREATE TABLE sales_report_log (
report_date DATE NOT NULL,
total_sales NUMERIC NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Agora bora criar a procedure em PL/pgSQL:
CREATE OR REPLACE FUNCTION generate_daily_sales_report()
RETURNS VOID AS $$
BEGIN
-- Calcular o total de vendas do dia atual
INSERT INTO sales_report_log (report_date, total_sales)
SELECT CURRENT_DATE, SUM(order_total)
FROM orders
WHERE order_date = CURRENT_DATE;
RAISE NOTICE 'Relatório de % criado com sucesso', CURRENT_DATE;
END;
$$ LANGUAGE plpgsql;
O que tá rolando aqui:
- A gente usa a função agregadora
SUM()pra calcular o total de vendas da tabelaorders. - A data do relatório (
report_date) sempre é o dia de hoje (CURRENT_DATE). - O resultado vai pra tabela
sales_report_log. - A mensagem
RAISE NOTICEserve pra debug: ela avisa que o relatório foi criado de boa.
Testando a procedure
Antes de automatizar a execução dessa procedure, sempre vale testar ela na mão. Bora rodar a função:
SELECT generate_daily_sales_report();
Agora confere o conteúdo da tabela sales_report_log:
SELECT * FROM sales_report_log;
Se você ver uma linha com a data de hoje e o valor certo do total de vendas — parabéns, sua função tá funcionando!
Automatizando tarefas no PostgreSQL
Às vezes é massa deixar o banco fazer as coisas sozinho: rodar relatórios, limpar registros antigos ou atualizar agregados no horário. O PostgreSQL deixa você fazer isso com a extensão pg_cron ou usando um planejador externo — tipo o cron do sistema ou o Task Scheduler.
Se você tá no Linux, o melhor é usar o pg_cron. Essa extensão roda SQL direto dentro do PostgreSQL, sem precisar de shell ou scripts.
Pra instalar o pg_cron (não esquece de trocar o XX pela sua versão do PostgreSQL):
sudo apt install postgresql-XX-cron
Depois de instalar, ativa ele na config. Abre o postgresql.conf e adiciona:
shared_preload_libraries = 'pg_cron'
Depois reinicia o PostgreSQL e ativa a extensão no seu banco:
CREATE EXTENSION pg_cron;
Agora dá pra agendar a tarefa. Por exemplo, rodar a função generate_daily_sales_report() todo dia à meia-noite:
SELECT cron.schedule(
'relatorio_vendas_diario',
'0 0 * * *',
$$ SELECT generate_daily_sales_report(); $$
);
Aqui:
'relatorio_vendas_diario'— nome da tarefa;'0 0 * * *'— horário no estilo cron (nesse caso, todo dia às 00:00);- O SQL entre
$$— é o código que vai rodar.
Pra ver todas as tarefas agendadas, usa:
SELECT * FROM cron.job;
Se você tá no Windows ou macOS, o pg_cron ou nem existe (no Windows), ou precisa compilar na mão (no macOS). Isso é chato, então na maioria dos casos é mais fácil usar o planejador do sistema.
Olha como faz:
- Cria um arquivo SQL com o comando que você quer:
echo "SELECT generate_daily_sales_report();" > /path/to/script.sql
- Usa o
psqlpra rodar o arquivo:
psql -h localhost -U postgres -d seu_banco -f /path/to/script.sql
Adiciona esse comando no planejador de tarefas:
No Linux/macOS: via
crontab -e:0 0 * * * psql -h localhost -U postgres -d seu_banco -f /path/to/script.sqlNo Windows: pelo Task Scheduler, criando uma tarefa que roda o
psql.execom os parâmetros certos.
- Se você tá no Linux, usa o
pg_cron— ele é prático e já integrado no PostgreSQL. - Se tá no Windows ou Mac, melhor confiar no planejador do sistema (
cronou Task Scheduler) e rodar o SQL pelopsql.
Assim você automatiza qualquer tarefa no PostgreSQL sem dor de cabeça.
Exemplos de automação de relatórios
- Relatório diário por região
Imagina que você quer criar automaticamente um relatório de vendas por região. Dá pra expandir nossa função assim:
CREATE OR REPLACE FUNCTION generate_regional_sales_report()
RETURNS VOID AS $$
BEGIN
INSERT INTO regional_sales_report_log (region, report_date, total_sales)
SELECT region, CURRENT_DATE, SUM(order_total)
FROM orders
WHERE order_date = CURRENT_DATE
GROUP BY region;
RAISE NOTICE 'Relatório regional de % criado com sucesso', CURRENT_DATE;
END;
$$ LANGUAGE plpgsql;
- Relatório mensal
Do mesmo jeito, dá pra criar uma procedure pra gerar relatório do mês. Só muda o filtro na consulta:
WHERE order_date BETWEEN date_trunc('month', CURRENT_DATE)
AND date_trunc('month', CURRENT_DATE) + interval '1 month - 1 day';
Erros comuns e como evitar
Na automação de relatórios podem rolar uns perrengues:
- Erro de sintaxe na função: sempre testa as funções na mão antes de automatizar.
- Frequência das tarefas: se rodar tarefa demais, pode sobrecarregar o banco. Configura o agendamento com cuidado.
- Dados duplicados: se o relatório rodar mais de uma vez por dia, pode duplicar. Usa chaves únicas pra evitar repetição.
Nessa aula você viu como configurar geração automática de relatórios no PostgreSQL. Agora dá pra otimizar seus processos analíticos e sobrar mais tempo pra coisas importantes... tipo caçar bug, codar ou sonhar com aquele SQL perfeito.
GO TO FULL VERSION