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.
🧱 Estructura
Section titled “🧱 Estructura”Para crear un procedimiento almacenado usamos CREATE PROCEDURE:
CREATE PROCEDURE <nombre_procedure> [@param1 <tipo>, ...]ASBEGIN -- Sentencias del procedureENDPara modificar un procedimiento existente, usamos ALTER PROCEDURE:
ALTER PROCEDURE <nombre_procedure> [@param1 <tipo>, ...]ASBEGIN -- Sentencias del procedureEND🧪 Ejemplos
Section titled “🧪 Ejemplos”Ejemplo CREATE/ALTER
Section titled “Ejemplo CREATE/ALTER”CREATE PROCEDURE spu_addCliente @razonSocial varchar(50), @descripcion varchar(255), @dir varchar(50), @tlf varchar(20), @provincia varchar(25), @sector varchar(25)ASBEGIN INSERT INTO Clientes (razonSocial, descripcion, dir, tlf, provincia, sector) VALUES (@razonSocial, @descripcion, @dir, @tlf, @provincia, @sector)
SELECT * FROM Clientes WHERE ID = SCOPE_IDENTITY()ENDNota
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.
Ejecución (EXEC)
Section titled “Ejecución (EXEC)”EXEC dbo.spu_addCliente 'Burgues King', 'Hamburgueses para todos', 'Calle Almádena, 1', '+34 44564432', 'Sevilla', 'Servicio'⚠️ Consideraciones
Section titled “⚠️ Consideraciones”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)ASBEGIN TRY BEGIN TRAN INSERT INTO Clientes (razonSocial, descripcion, dir, tlf, provincia, sector) VALUES (@razonSocial, @descripcion, @dir, @tlf, @provincia, @sector) COMMITEND TRYBEGIN CATCH ROLLBACK PRINT ERROR_MESSAGE()END CATCHDECLARE @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 @razonSocialNota
Esto permite capturar errores y revertir los cambios si ocurre algún fallo durante la inserción.
Procedimientos que devuelven valores
Section titled “Procedimientos que devuelven valores”Los procedimientos almacenados también pueden devolver valores enteros usando la instrucción RETURN.
CREATE PROCEDURE spu_esvalido @id varchar(20)ASBEGIN IF (SELECT importe FROM Pedidos WHERE ID = @id) > 1000 RETURN 1 ELSE RETURN 0ENDEjecución del procedimiento:
DECLARE @importe intEXEC @importe = spu_esvalido 4PRINT @importeResultado de la ejecución:
0Pedido que estamos evaluando:
| ID | cant | codCliente | codArticulo | codEstadoPedido | importe | fecha | codProposicion |
|---|---|---|---|---|---|---|---|
| 4 | 34 | 24 | 5 | 2 | 442.00 | May 3, 2023 | 3 |