CodeGym /Cursos /SQL SELF /Geração automática de relatórios por agendamento

Geração automática de relatórios por agendamento

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

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:

  1. Criar uma procedure em PL/pgSQL que gera o relatório.
  2. Configurar o log dos resultados (se precisar).
  3. 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 tabela orders.
  • 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 NOTICE serve 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:

  1. Cria um arquivo SQL com o comando que você quer:
echo "SELECT generate_daily_sales_report();" > /path/to/script.sql
  1. Usa o psql pra rodar o arquivo:
psql -h localhost -U postgres -d seu_banco -f /path/to/script.sql
  1. 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.sql
      
    • No Windows: pelo Task Scheduler, criando uma tarefa que roda o psql.exe com 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 (cron ou Task Scheduler) e rodar o SQL pelo psql.

Assim você automatiza qualquer tarefa no PostgreSQL sem dor de cabeça.

Exemplos de automação de relatórios

  1. 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;
  1. 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.

2
Tarefa
SQL SELF, nível 60, lição 0
Bloqueado
Criação de tabela para relatórios
Criação de tabela para relatórios
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION