Skip to content

Procedimientos Almacenados

Los procedimientos almacenados son bloques de código precompilados que se almacenan en la base de datos y pueden ser invocados desde una aplicación o desde otras partes de la base de datos.

Estas son algunas ventajas principales:

  • 🔹 Reutilización de código: Se pueden llamar múltiples veces desde distintos lugares.
  • 🔹 Optimización de consultas: Al estar precompilados, el motor de base de datos puede ejecutar el código más rápido.
  • 🔹 Transacciones atómicas: Pueden incluir transacciones que aseguran que todas las operaciones se realicen correctamente o se deshagan en caso de error.
  • 🔹 Seguridad: Se pueden otorgar permisos específicos a usuarios o roles para ejecutar o modificar el procedimiento, sin dar acceso directo a las tablas involucradas.

Para crear un procedimiento almacenado usamos CREATE PROCEDURE:

CREATE PROCEDURE <nombre_procedure> [@param1 <tipo>, ...]
AS
BEGIN
-- Sentencias del procedure
END

Para modificar un procedimiento existente, usamos ALTER PROCEDURE:

ALTER PROCEDURE <nombre_procedure> [@param1 <tipo>, ...]
AS
BEGIN
-- Sentencias del procedure
END

CREATE PROCEDURE spu_addCliente
@razonSocial varchar(50),
@descripcion varchar(255),
@dir varchar(50),
@tlf varchar(20),
@provincia varchar(25),
@sector varchar(25)
AS
BEGIN
INSERT INTO Clientes (razonSocial, descripcion, dir, tlf, provincia, sector)
VALUES (@razonSocial, @descripcion, @dir, @tlf, @provincia, @sector)
SELECT * FROM Clientes WHERE ID = SCOPE_IDENTITY()
END

Nota

En este procedimiento se inserta un nuevo cliente y luego se devuelve la fila recién creada usando SCOPE_IDENTITY() para obtener la ID generada.


EXEC dbo.spu_addCliente
'Burgues King',
'Hamburgueses para todos',
'Calle Almádena, 1',
'+34 44564432',
'Sevilla',
'Servicio'

Es recomendable usar TRY…CATCH y TRANSACTION para manejar errores de manera segura:

ALTER PROCEDURE [dbo].[spu_addCliente]
@razonSocial varchar(50) OUTPUT,
@descripcion varchar(255),
@dir varchar(50),
@tlf varchar(20),
@provincia varchar(25),
@sector varchar(25)
AS
BEGIN TRY
BEGIN TRAN
INSERT INTO Clientes (razonSocial, descripcion, dir, tlf, provincia, sector)
VALUES (@razonSocial, @descripcion, @dir, @tlf, @provincia, @sector)
COMMIT
END TRY
BEGIN CATCH
ROLLBACK
PRINT ERROR_MESSAGE()
END CATCH
DECLARE @razonSocial varchar(50)
SET @razonSocial = 'Burgues King'
EXEC dbo.spu_addCliente
@razonSocial OUTPUT,
'Hamburgueses para todos',
'Calle Almádena, 1',
'+34 44564432',
'Sevilla',
'Servicio'
PRINT @razonSocial

Nota

Esto permite capturar errores y revertir los cambios si ocurre algún fallo durante la inserción.


Los procedimientos almacenados también pueden devolver valores enteros usando la instrucción RETURN.

CREATE PROCEDURE spu_esvalido
@id varchar(20)
AS
BEGIN
IF (SELECT importe FROM Pedidos WHERE ID = @id) > 1000
RETURN 1
ELSE
RETURN 0
END

Ejecución del procedimiento:

DECLARE @importe int
EXEC @importe = spu_esvalido 4
PRINT @importe

Resultado de la ejecución:

0

Pedido que estamos evaluando:

IDcantcodClientecodArticulocodEstadoPedidoimportefechacodProposicion
4342452442.00May 3, 20233