Uso de Sentencias IF en Procedimientos en MySQL Usando la Base de Datos «Comisaria»

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.

person encoding in laptop
Photo by Lukas on Pexels.com

Gracias por visitar mi blog de informática, mi nombre es Tomás y soy formador y desarrollador web. Si quiere usted dejarme alguna sugerencia, ayuda o quiere un servicio de formación estoy escuchando ofertas en tomas.gonzalez@infogonzalez.com, en Facebook a https://www.facebook.com/Infogonzalez estoy deseando escucharle. Su duda o sugerencia NO molesta.

Deja un comentario

Información básica sobre protección de datos Ver más

  • Responsable: Tomas Gonzalez.
  • Finalidad:  Moderar los comentarios.
  • Legitimación:  Por consentimiento del interesado.
  • Destinatarios y encargados de tratamiento:  No se ceden o comunican datos a terceros para prestar este servicio.
  • Derechos: Acceder, rectificar y suprimir los datos.
  • Información Adicional: Puede consultar la información detallada en la Política de Privacidad.

error: Content is protected !!

Descubre más desde InfoGonzalez - Blog de formador e informático

Suscríbete ahora para seguir leyendo y obtener acceso al archivo completo.

Seguir leyendo

Este sitio web utiliza cookies, si necesitas más información puedes visitar nuestra política de privacidad    Ver
Privacidad