Las sentencias IF
en MySQL son esenciales para la ejecución condicional de código dentro de procedimientos almacenados. En este artículo, exploraremos cómo utilizar las sentencias IF
en procedimientos almacenados, empleando la estructura de la base de datos «Comisaria» como ejemplo.
Estructura de la Base de Datos «Comisaria»
La base de datos «Comisaria» está compuesta por las siguientes tablas:
- Agentes: Contiene información sobre los agentes.
- Ciudadanos: Registra los datos de los ciudadanos.
- Casos: Detalles de los casos asignados a los agentes.
- Reportes: Reportes hechos por ciudadanos sobre los casos.
Definición de las Tablas
CREATE DATABASE Comisaria;
USE Comisaria;
CREATE TABLE Agentes (
id_agente INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(50) NOT NULL,
rango VARCHAR(30),
salario DECIMAL(10, 2) NOT NULL,
fecha_ingreso DATE
);
CREATE TABLE Ciudadanos (
id_ciudadano INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(50) NOT NULL,
direccion VARCHAR(100),
telefono VARCHAR(15)
);
CREATE TABLE Casos (
id_caso INT AUTO_INCREMENT PRIMARY KEY,
descripcion TEXT,
fecha_inicio DATE,
estado VARCHAR(20),
id_agente INT,
FOREIGN KEY (id_agente) REFERENCES Agentes(id_agente)
);
CREATE TABLE Reportes (
id_reporte INT AUTO_INCREMENT PRIMARY KEY,
id_caso INT,
id_ciudadano INT,
descripcion TEXT,
fecha_reporte DATE,
FOREIGN KEY (id_caso) REFERENCES Casos(id_caso),
FOREIGN KEY (id_ciudadano) REFERENCES Ciudadanos(id_ciudadano)
);
Insertar Datos en las Tablas
INSERT INTO Agentes (nombre, rango, salario, fecha_ingreso) VALUES
('Juan Pérez', 'Sargento', 45000.00, '2015-06-23'),
('Ana Gómez', 'Teniente', 50000.00, '2018-09-15'),
('Carlos López', 'Cabo', 40000.00, '2020-01-10');
INSERT INTO Ciudadanos (nombre, direccion, telefono) VALUES
('Pedro Martínez', 'Calle Falsa 123', '555-1234'),
('María Fernández', 'Avenida Siempre Viva 742', '555-5678'),
('Luis García', 'Boulevard Central 456', '555-8765');
INSERT INTO Casos (descripcion, fecha_inicio, estado, id_agente) VALUES
('Robo en tienda', '2022-03-10', 'Abierto', 1),
('Asalto a mano armada', '2022-04-22', 'Cerrado', 2),
('Vandalismo en parque', '2022-05-15', 'En Proceso', 3);
INSERT INTO Reportes (id_caso, id_ciudadano, descripcion, fecha_reporte) VALUES
(1, 1, 'Robo de mercancía en tienda', '2022-03-10'),
(2, 2, 'Asalto a mano armada en banco', '2022-04-22'),
(3, 3, 'Daños en parque público', '2022-05-15');
Uso de la Sentencia IF en Procedimientos
La sentencia IF
permite ejecutar bloques de código basados en condiciones específicas. Veamos algunos ejemplos prácticos.
Ejemplo 1: Procedure para Actualizar el Estado de un Caso
Este procedimiento actualiza el estado de un caso según la cantidad de días desde su inicio.
DELIMITER //
CREATE PROCEDURE actualizar_estado_caso(p_id_caso INT)
BEGIN
DECLARE dias INT;
-- Calcular los días desde la fecha de inicio del caso
SELECT DATEDIFF(CURRENT_DATE, fecha_inicio) INTO dias FROM Casos WHERE id_caso = p_id_caso;
-- Actualizar el estado del caso basado en la cantidad de días
IF dias > 30 THEN
UPDATE Casos SET estado = 'Archivado' WHERE id_caso = p_id_caso;
ELSEIF dias BETWEEN 15 AND 30 THEN
UPDATE Casos SET estado = 'En Proceso' WHERE id_caso = p_id_caso;
ELSE
UPDATE Casos SET estado = 'Abierto' WHERE id_caso = p_id_caso;
END IF;
END //
DELIMITER ;
Ejemplo 2: Procedure para Aumentar el Salario de los Agentes Basado en su Rango
Este procedimiento incrementa el salario de los agentes dependiendo de su rango.
DELIMITER //
CREATE PROCEDURE incrementar_salario_agentes()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE agente_id INT;
DECLARE agente_rango VARCHAR(30);
DECLARE agente_salario DECIMAL(10, 2);
DECLARE agente_cursor CURSOR FOR SELECT id_agente, rango, salario FROM Agentes;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN agente_cursor;
read_loop: LOOP
FETCH agente_cursor INTO agente_id, agente_rango, agente_salario;
IF done THEN
LEAVE read_loop;
END IF;
-- Incrementar salario basado en el rango del agente
IF agente_rango = 'Sargento' THEN
SET agente_salario = agente_salario * 1.10;
ELSEIF agente_rango = 'Teniente' THEN
SET agente_salario = agente_salario * 1.15;
ELSEIF agente_rango = 'Cabo' THEN
SET agente_salario = agente_salario * 1.05;
END IF;
UPDATE Agentes SET salario = agente_salario WHERE id_agente = agente_id;
END LOOP;
CLOSE agente_cursor;
END //
DELIMITER ;
Ejemplo 3: Procedure para Generar Reporte de Casos por Agente
Este procedimiento genera un reporte con el conteo de casos por cada agente.
DELIMITER //
CREATE PROCEDURE reporte_casos_por_agente()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE agente_id INT;
DECLARE agente_nombre VARCHAR(50);
DECLARE caso_count INT;
DECLARE agente_cursor CURSOR FOR SELECT id_agente, nombre FROM Agentes;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN agente_cursor;
read_loop: LOOP
FETCH agente_cursor INTO agente_id, agente_nombre;
IF done THEN
LEAVE read_loop;
END IF;
-- Contar los casos del agente
SELECT COUNT(*) INTO caso_count FROM Casos WHERE id_agente = agente_id;
-- Imprimir el reporte
SELECT CONCAT('Agente: ', agente_nombre, ' - Casos: ', caso_count) AS Reporte;
END LOOP;
CLOSE agente_cursor;
END //
DELIMITER ;
Conclusión
Las sentencias IF
en procedimientos almacenados de MySQL proporcionan una herramienta poderosa para ejecutar código condicionalmente. Utilizando la base de datos «Comisaria», hemos mostrado cómo implementar procedimientos que utilizan IF
para actualizar estados, incrementar salarios, y generar reportes. Estos ejemplos ilustran cómo las sentencias condicionales pueden mejorar la lógica y funcionalidad de los procedimientos almacenados, permitiendo una gestión más eficiente y efectiva de la base de datos.