即使在明確患有的是心因性勃起障礙,需要正確的心理健康治療才能根治問題,仍是無可奈何地依靠服用犀利士、威而鋼等ED藥物。因為心理疾病難以完全治愈,一定條件下可從新觸發。

Banco de dados MySql

Dominando Stored Procedures: O Guia Prático para Escrever SQL como um Profissional

Curso gratuito - Como trabalhar com o Banco de dados MySQL

Se você está começando no mundo dos bancos de dados, provavelmente já se pegou escrevendo o mesmo comando SELECT ou um bloco complexo de INSERT e UPDATE várias vezes. Além de ser cansativo, isso pode ser lento e inseguro.

É aqui que entram as Stored Procedures (ou Procedimentos Armazenados). Elas são, sem dúvida, uma das ferramentas mais poderosas e essenciais no arsenal de um desenvolvedor de banco de dados.

Neste artigo, vamos desmistificar o que elas são, por que são tão importantes e, o mais importante, como criar e usar suas próprias procedures passo a passo.

O que é uma Stored Procedure?

Pense em uma Stored Procedure como uma receita salva dentro do próprio banco de dados.

Em vez de enviar ao banco a lista completa de ingredientes e o modo de preparo toda vez que você quer fazer um bolo (vários comandos SQL), você simplesmente salva essa receita no banco com um nome, como fazer_bolo_chocolate.

Da próxima vez, você apenas diz: EXECUTE fazer_bolo_chocolate.

Tecnicamente, uma Stored Procedure é um conjunto de um ou mais comandos SQL (como SELECT, INSERT, UPDATE, DELETE, e até lógica de programação como IF/ELSE) que são agrupados, nomeados e armazenados diretamente no servidor do banco de dados.

As Vantagens: Por que se dar ao trabalho?

Usar procedures não é apenas uma questão de organização; é uma questão de performance, segurança e eficiência.

  1. Performance: Quando você cria uma procedure, o SGBD (Sistema Gerenciador de Banco de Dados) a “pré-compila”. Ele analisa o código, cria o melhor plano de execução e o armazena. Da próxima vez que você a executa, ela é muito mais rápida do que enviar o SQL “cru”.
  2. Segurança: Este é um ponto crucial. Você pode dar permissão a um usuário para executar uma procedure (GRANT EXECUTE) sem que ele precise de permissão para acessar ou modificar as tabelas diretamente. Isso impede que usuários (ou aplicações) executem comandos DELETE ou UPDATE destrutivos por acidente ou malícia.
  3. Reusabilidade e Manutenção: Escreva uma vez, use em mil lugares. Se a regra de negócio para cadastrar um cliente mudar, você não precisa alterar o código em 10 lugares diferentes da sua aplicação (Java, C#, Python…). Você altera apenas a procedure no banco, e todas as partes da aplicação que a utilizam são atualizadas automaticamente.
  4. Menos Tráfego de Rede: Em vez de enviar 100 linhas de um script SQL complexo pela rede, você envia apenas uma linha: EXEC minha_procedure.

Nosso Ambiente de Teste: O Banco UniversidadeTeste

Para aprender na prática, precisamos de um banco de dados. Vamos usar um cenário simples de uma universidade com três tabelas: Alunos, Cursos e Matriculas.

Copie e execute o código abaixo no seu SGBD (Estes scripts são para SQL Server / T-SQL) para criar nosso ambiente de testes.

-- 1. --- CRIA O BANCO DE DADOS ---
IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = 'UniversidadeTeste')
BEGIN
    CREATE DATABASE UniversidadeTeste;
END;
GO

-- 2. --- USA O BANCO DE DADOS CRIADO ---
USE UniversidadeTeste;
GO

-- 3. --- CRIA A TABELA DE ALUNOS ---
PRINT 'Criando tabela Alunos...';
CREATE TABLE Alunos (
    ID_Aluno INT PRIMARY KEY IDENTITY(1,1),
    Nome VARCHAR(100) NOT NULL,
    Email VARCHAR(100) UNIQUE NOT NULL
);
GO

-- 4. --- CRIA A TABELA DE CURSOS ---
PRINT 'Criando tabela Cursos...';
CREATE TABLE Cursos (
    ID_Curso INT PRIMARY KEY IDENTITY(10,10),
    Nome_Curso VARCHAR(150) NOT NULL,
    Carga_Horaria INT NOT NULL
);
GO

-- 5. --- CRIA A TABELA DE MATRÍCULAS ---
PRINT 'Criando tabela Matriculas...';
CREATE TABLE Matriculas (
    ID_Matricula INT PRIMARY KEY IDENTITY(100,1),
    FK_Aluno INT NOT NULL,
    FK_Curso INT NOT NULL,
    Data_Matricula DATE NOT NULL,
    
    CONSTRAINT FK_Matriculas_Alunos FOREIGN KEY (FK_Aluno) REFERENCES Alunos(ID_Aluno) ON DELETE CASCADE,
    CONSTRAINT FK_Matriculas_Cursos FOREIGN KEY (FK_Curso) REFERENCES Cursos(ID_Curso)
);
GO

-- 6. --- INSERE DADOS DE EXEMPLO ---
PRINT 'Inserindo dados de exemplo...';

INSERT INTO Alunos (Nome, Email) VALUES
('Ana Silva', 'ana.silva@email.com'),
('Bruno Costa', 'bruno.costa@email.com'),
('Carla Dias', 'carla.dias@email.com');

INSERT INTO Cursos (Nome_Curso, Carga_Horaria) VALUES
('Banco de Dados Essencial', 80),
('Programação Web com JavaScript', 120);

INSERT INTO Matriculas (FK_Aluno, FK_Curso, Data_Matricula) VALUES
(1, 10, '2025-10-01'), -- Ana (ID 1) no Banco de Dados (ID 10)
(2, 10, '2025-10-02'); -- Bruno (ID 2) no Banco de Dados (ID 10)

GO

PRINT 'Ambiente de teste pronto!';
-- Verifique se tudo foi criado
SELECT * FROM Alunos;
SELECT * FROM Cursos;
SELECT * FROM Matriculas;
GO

Mão na Massa: Criando Nossas Stored Procedures

Com o banco pronto, vamos criar nossas “receitas”.

Exemplo 1: A Procedure Simples (Sem Parâmetros)

Objetivo: Criar uma procedure que lista todos os alunos cadastrados, ordenados por nome.

-- 1. CRIANDO a procedure
CREATE PROCEDURE sp_ListarTodosAlunos
AS
BEGIN
    -- Este é o bloco de código que será executado
    SELECT 
        ID_Aluno, 
        Nome, 
        Email
    FROM 
        Alunos
    ORDER BY 
        Nome;
END;
GO

Como usar? Simples! Em vez de digitar todo o SELECT acima, agora você (ou sua aplicação) só precisa executar:

-- 2. EXECUTANDO a procedure
EXEC sp_ListarTodosAlunos;

O resultado será a lista de alunos.

Exemplo 2: Procedure com Parâmetros de ENTRADA (IN)

Objetivo: Criar uma procedure reutilizável para matricular um aluno em um curso. Precisamos informar qual aluno e qual curso.

-- 1. CRIANDO a procedure
CREATE PROCEDURE sp_MatricularAluno
    -- Parâmetros de Entrada (os 'ingredientes' da receita)
    @ID_Aluno_Param INT,
    @ID_Curso_Param INT
AS
BEGIN
    -- Bloco de código
    INSERT INTO Matriculas (FK_Aluno, FK_Curso, Data_Matricula)
    VALUES (@ID_Aluno_Param, @ID_Curso_Param, GETDATE()); -- GETDATE() pega a data/hora atual
        
    PRINT 'Aluno matriculado com sucesso!';
END;
GO

Como usar? Vamos matricular a aluna “Carla Dias” (ID 3) no curso de “Programação Web” (ID 20).

-- 2. EXECUTANDO a procedure com parâmetros
EXEC sp_MatricularAluno @ID_Aluno_Param = 3, @ID_Curso_Param = 20;

-- Vamos verificar o resultado
SELECT * FROM Matriculas WHERE FK_Aluno = 3;

Exemplo 3: Procedure com Parâmetro de SAÍDA (OUTPUT)

Objetivo: Às vezes, queremos que a procedure nos devolva um valor. Vamos criar uma que conta quantas matrículas um aluno possui e nos retorna esse número.

-- 1. CRIANDO a procedure
CREATE PROCEDURE sp_ContarMatriculasDoAluno
    -- Parâmetro de Entrada (Quem?)
    @ID_Aluno_Param INT,
    
    -- Parâmetro de Saída (Onde guardar o resultado?)
    @Total_Matriculas INT OUTPUT
AS
BEGIN
    -- A consulta atribui o resultado da contagem à variável de saída
    SELECT 
        @Total_Matriculas = COUNT(*) 
    FROM 
        Matriculas
    WHERE 
        FK_Aluno = @ID_Aluno_Param;
END;
GO

Como usar? A execução é um pouco diferente, pois precisamos “oferecer” uma variável para o SGBD preencher com o resultado.

-- 2. EXECUTANDO a procedure

-- A. Primeiro, declaramos uma 'caixinha' (variável) para guardar o resultado
DECLARE @ResultadoDaContagem INT;

-- B. Executamos, passando nossa 'caixinha' e marcando-a como OUTPUT
EXEC sp_ContarMatriculasDoAluno 
    @ID_Aluno_Param = 1, -- Queremos contar as matrículas da Ana (ID 1)
    @Total_Matriculas = @ResultadoDaContagem OUTPUT;

-- C. Agora, o resultado está na nossa 'caixinha'
SELECT @ResultadoDaContagem AS 'Total de Matrículas da Ana';

(O resultado deve ser 1).

Gerenciando suas Procedures

Por fim, como modificar ou excluir uma procedure?

  • Alterar: Se você precisar mudar a lógica da sp_ListarTodosAlunos (por exemplo, para mostrar apenas 5), não use CREATE novamente (dará erro). Use ALTER.SQLALTER PROCEDURE sp_ListarTodosAlunos AS BEGIN -- Código modificado SELECT TOP 5 Nome, Email FROM Alunos ORDER BY Nome; END;
  • Excluir: Se a procedure não for mais necessária:SQLDROP PROCEDURE sp_ListarTodosAlunos;

Conclusão

Stored Procedures são um pilar do desenvolvimento de banco de dados. Elas centralizam a lógica de negócio, aumentam a segurança e melhoram a performance.

Ao encapsular seus comandos SQL em procedures, você deixa de enviar “scripts” para o banco e passa a executar “tarefas” nomeadas, tornando seu código mais limpo, seguro e profissional.

About the author

Danilo Filitto

Mestre em Ciência da Computação pela Universidade Estadual de Maringá - UEM, Pós-Graduado em Redes de Computadores e Comunicação de Dados pela Universidade do Estado do Paraná - UEL, Bacharel em Ciência da Computação pela Universidade do Oeste Paulista - UNOESTE.

Atuo na área acadêmica como professor desde 2006. Atualmente leciono na UNOESTE (Universidade do Oeste Paulista), no SENAC (Serviço Nacional de Aprendizagem Comercial) e possuo vários cursos na Udemy (https://www.udemy.com/user/danilo-filitto/).

Além disso, sou o CEO dos sites https:www.dfilitto.com.br e https:www.makeindiegames.com.br

Você também pode me encontrar no YouTube por meio do endereço https://www.youtube.com/danilofilittoppr

Add Comment

Click here to post a comment

Aprenda a criar seus próprios jogos

Cursos em promoção

Cursos em destaque

Quer aprender a programar?

Aprenda a criar seus próprios jogos com os melhores desenvolvedores