SQL – Diferenças Entre Funções e Procedures

Descubra as diferenças entre funções e procedures em bancos de dados, com práticas recomendadas para versionamento e hacks avançados para gerenciar estruturas de forma eficiente e escalável.

Compartilhe:

No mundo dos bancos de dados, funções e procedures são ferramentas poderosas para encapsular lógicas e operações. Apesar de suas semelhanças, possuem diferenças fundamentais que influenciam sua utilização. Além disso, o versionamento dessas estruturas é um desafio crítico para garantir consistência e rastreabilidade em ambientes de produção.

Este artigo explora em detalhes as diferenças entre funções e procedures, quando usar cada uma, e apresenta boas práticas de versionamento para manutenção e escalabilidade de bancos de dados.


Diferenças Fundamentais Entre Funções e Procedures

1. Definição e Propósito

  • Funções: Realizam uma tarefa específica e sempre retornam um único valor (ou conjunto de valores, em casos específicos). São frequentemente usadas em consultas SQL.
  • Procedures: Executam uma sequência de operações e podem ou não retornar valores. São ideais para encapsular lógicas complexas.

2. Uso em Consultas

  • Funções podem ser chamadas diretamente em uma consulta SQL, como parte de SELECT, WHERE, ou GROUP BY.
  • Procedures não podem ser chamadas diretamente em consultas SQL; precisam ser invocadas com o comando CALL ou equivalente.

Exemplo de Função

DELIMITER //
CREATE FUNCTION CalculateTax(subtotal DECIMAL(10,2))
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
    RETURN subtotal * 0.2;
END //
DELIMITER ;

Uso:

SELECT product_name, CalculateTax(price) AS tax FROM products;

Exemplo de Procedure

DELIMITER //
CREATE PROCEDURE UpdateStock(IN product_id INT, IN quantity INT)
BEGIN
    UPDATE inventory SET stock = stock + quantity WHERE id = product_id;
END //
DELIMITER ;

Uso:

CALL UpdateStock(101, 50);

3. Retorno de Valores

  • Funções: Devem retornar um valor único e podem ser usadas em expressões.
  • Procedures: Podem retornar múltiplos valores por meio de parâmetros de saída ou executar sem retornar nada.

Exemplo de Procedure com Parâmetros de Saída

DELIMITER //
CREATE PROCEDURE GetCustomerDetails(IN customer_id INT, OUT full_name VARCHAR(255))
BEGIN
    SELECT CONCAT(first_name, ' ', last_name) INTO full_name
    FROM customers WHERE id = customer_id;
END //
DELIMITER ;

Uso:

Cypress, do Zero à Nuvem: domine a automação de testes com confiabilidade e eficiência

Aprimore suas habilidades de automação de testes com Cypress, desde o início até a integração contínua.

Saiba Mais

CALL GetCustomerDetails(1, @name);
SELECT @name;

4. Impacto no Banco de Dados

  • Funções: Geralmente não devem alterar o estado do banco de dados (e.g., não podem executar INSERT, UPDATE ou DELETE em muitos sistemas como PostgreSQL).
  • Procedures: Podem realizar alterações no banco de dados, além de executar operações complexas.

Quando Usar Funções ou Procedures

Quando Usar Funções

  1. Cálculos Repetitivos: Fórmulas matemáticas ou lógicas reutilizáveis.
  2. Manipulação de Strings: Concatenação, formatação ou extração de dados textuais.
  3. Consultas: Para simplificar condições ou enriquecer saídas.

Exemplo Prático

CREATE FUNCTION FormatDate(date_input DATE)
RETURNS VARCHAR(20)
BEGIN
    RETURN DATE_FORMAT(date_input, '%d/%m/%Y');
END;

Uso:

SELECT FormatDate(order_date) AS formatted_date FROM orders;

Quando Usar Procedures

  1. Fluxos Complexos: Envolver várias operações e lógica condicional.
  2. Manutenção e ETL: Processos de carga, transformação e extração de dados.
  3. Automação: Rotinas automatizadas como envio de relatórios.

Exemplo Prático

DELIMITER //
CREATE PROCEDURE GenerateMonthlyReport(IN month INT, IN year INT)
BEGIN
    INSERT INTO reports (month, year, total_sales)
    SELECT month, year, SUM(total)
    FROM sales
    WHERE MONTH(sale_date) = month AND YEAR(sale_date) = year;
END //
DELIMITER ;

Uso:

CALL GenerateMonthlyReport(12, 2023);

Boas Práticas de Versionamento

Versionar estruturas como funções e procedures é essencial para manter consistência em ambientes de desenvolvimento, teste e produção. Aqui estão as melhores práticas:

1. Nomeação e Controle de Versões

  • Inclua números de versão no nome da função ou procedure.CREATE FUNCTION CalculateTax_v1() CREATE PROCEDURE GenerateMonthlyReport_v2()
  • Use um repositório de controle de versão (e.g., Git) para armazenar scripts.

2. Scripts de Migração

  • Mantenha scripts organizados em diretórios como:migrations/ 2024-01-01_add_calculate_tax_v1.sql 2024-02-15_update_generate_monthly_report_v2.sql
  • Use ferramentas como Flyway ou Liquibase para gerenciar versões.

3. Documentação e Comentários

  • Documente o propósito, parâmetros e alterações feitas em cada versão.-- Version 1.0 -- Purpose: Calculate 20% tax on a subtotal. CREATE FUNCTION CalculateTax_v1(...);

4. Testes Automatizados

  • Escreva testes para validar o comportamento esperado.
  • Exemplos de validação:SELECT CalculateTax_v1(100) AS tax;

5. Rollback Planejado

  • Para cada alteração, inclua um script de rollback:-- Script para reverter mudanças DROP FUNCTION IF EXISTS CalculateTax_v1;

6. Controle de Dependências

  • Certifique-se de que alterações em uma função ou procedure não quebrem outras dependências.
  • Use ferramentas de análise de dependência para identificar impactos.

Hacks Avançados para Gerenciamento de Versões

1. Armazenar Metadados no Banco de Dados

Crie uma tabela para rastrear versões e alterações:

CREATE TABLE db_versions (
    id INT AUTO_INCREMENT PRIMARY KEY,
    script_name VARCHAR(255),
    applied_at DATETIME,
    description TEXT
);

Atualize-a automaticamente:

INSERT INTO db_versions (script_name, applied_at, description)
VALUES ('2024-01-01_add_calculate_tax_v1.sql', NOW(), 'Adiciona função para cálculo de impostos.');

2. Automatizar Deploys com CI/CD

  • Integre scripts de funções e procedures em pipelines de integração contínua (e.g., Jenkins, GitLab CI).
  • Execute testes automatizados após o deploy.

3. Fallback em Produção

  • Crie uma cópia da versão anterior antes de aplicar mudanças:CREATE FUNCTION CalculateTax_v1_backup AS ...;
  • Restaure em caso de falha:DROP FUNCTION CalculateTax_v2; RENAME FUNCTION CalculateTax_v1_backup TO CalculateTax_v1;

Conclusão

Funções e procedures desempenham papéis distintos em bancos de dados, sendo cada uma ideal para cenários específicos. Ao entender suas diferenças e implementar boas práticas de versionamento, você garante que seu banco de dados permaneça consistente, escalável e fácil de manter. Além disso, o uso de hacks avançados e automação pode transformar o gerenciamento de versões em um processo fluido e confiável.


Referências para Aprender Mais

  1. Documentação Oficial do MySQL: https://dev.mysql.com/doc/
  2. PostgreSQL Documentation: https://www.postgresql.org/docs/current/
  3. SQL Server Documentation: https://learn.microsoft.com/en-us/sql/
  4. Ferramentas de Migração:
  5. Cursos Interativos:

Compartilhe:

Ramos da Informática
Ramos da Informáticahttps://ramosdainformatica.com.br
Ramos da Informática é um hub de comunidade sobre linguagens de programação, banco de dados, DevOps, Internet das Coisas, tecnologia da indústria 4.0, Cyber Segurança e Startups.

RECENTES

Agentes de IA: Ferramentas, Cursos e Tendências para 2025

Nesta edição, compartilho aprendizados recentes sobre agentes de IA,...

T-Systems oferece formação gratuita em tecnologia

A T-Systems está com vagas abertas para o T-Academy,...

CESAR School abre 5 mil vagas gratuitas em tecnologia

Diante da crescente demanda por profissionais capacitados em tecnologia,...

Bootcamp gratuito para formar engenheiros full stack 

WEX e DIO lançam bootcamp gratuito para formar engenheiros...

Engenharia de Prompt: PASSEF e COSTAR e a Criação de Agentes de IA

Quando surgiu o tema "Engenharia de Prompt", logo pensei:...

Automação Inteligente: n8n, Node.js, LangChain.js, IA Generativa e JavaScript para Agente

Descubra como combinar n8n, Node.js, LangChain.js, IA generativa e...
🤖

Automatize como um Pro com N8N

Domine automações visuais com um dos cursos mais completos da atualidade.

  • 🚀 Fluxos avançados e profissionais
  • 🔌 Integrações com APIs reais
  • 📊 Aumente a produtividade no trabalho
  • 💡 Sem código, sem mistério
👉 Quero Automatizar Agora