Os procedimentos armazenados são um lote de instruções SQL que podem ser executadas de duas maneiras. A maioria dos principais DBMs suporta procedimentos armazenados; no entanto, nem todos o fazem. Você precisará verificar com sua documentação de ajuda específica do DBMS para obter detalhes. Como estou mais familiarizado com o SQL Server, usarei isso como meus exemplos.
Para criar um procedimento armazenado, a sintaxe é bastante simples:
CREATE PROCEDURE <owner>.<procedure name>
<Param> <datatype>
AS
<Body>
Assim, por exemplo:
CREATE PROCEDURE Users_GetUserInfo
@login nvarchar(30)=null
AS
SELECT * from [Users]
WHERE ISNULL(@login,login)=login
Um benefício dos procedimentos armazenados é que você pode centralizar a lógica de acesso a dados em um único local que é fácil para os DBAs otimizarem. Os procedimentos armazenados também têm um benefício de segurança, pois você pode conceder direitos de execução a um procedimento armazenado, mas o usuário não precisará ter permissões de leitura/gravação nas tabelas subjacentes. Este é um bom primeiro passo contra a injeção de SQL.
Os procedimentos armazenados vêm com desvantagens, basicamente a manutenção associada à sua operação básica de CRUD. Digamos que para cada tabela você tenha um Insert, Update, Delete e pelo menos um select baseado na chave primária, ou seja, cada tabela terá 4 procedimentos. Agora pegue um banco de dados de tamanho decente de 400 tabelas e você terá 1600 procedimentos! E isso supondo que você não tenha duplicatas, o que provavelmente terá.
É aqui que usar um ORM ou algum outro método para gerar automaticamente suas operações CRUD básicas tem muito mérito.