Creación de Procedures con Bucles For y While en MySQL Usando la Base de Datos «Comisaria»

En MySQL, los procedimientos almacenados (Procedures) son una herramienta poderosa para ejecutar un conjunto de operaciones SQL de manera repetitiva y eficiente. Aunque MySQL no soporta bucles FOR de forma nativa, se pueden implementar mediante el uso de bucles WHILE. En este artículo, exploraremos cómo crear procedimientos con bucles en MySQL utilizando la base de datos «Comisaria».

Estructura de la Base de Datos «Comisaria»

La base de datos «Comisaria» consta de cuatro tablas principales:

  • Agentes: Información sobre los agentes de la comisaría.
  • Ciudadanos: Información sobre los ciudadanos.
  • Casos: Detalles de los casos asignados a los agentes.
  • Reportes: Reportes hechos por los 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');

Creación de Procedures con Bucles While

Ejemplo de Procedure con Bucle While

Este procedimiento contará el número de casos asignados a cada agente y actualizará la tabla Agentes con esta información.

DELIMITER //

CREATE PROCEDURE contar_casos_por_agente()
BEGIN
    DECLARE done INT DEFAULT 0;
    DECLARE agente_id INT;
    DECLARE caso_count INT;
    DECLARE agente_cursor CURSOR FOR SELECT id_agente FROM Agentes;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    OPEN agente_cursor;

    read_loop: LOOP
        FETCH agente_cursor INTO agente_id;
        IF done THEN
            LEAVE read_loop;
        END IF;

        SET caso_count = (SELECT COUNT(*) FROM Casos WHERE id_agente = agente_id);

        UPDATE Agentes
        SET casos_asignados = caso_count
        WHERE id_agente = agente_id;
    END LOOP;

    CLOSE agente_cursor;
END //

DELIMITER ;

Ejemplo de Procedure con Bucle Implementando un For

Dado que MySQL no soporta el bucle FOR directamente, podemos simularlo usando un bucle WHILE.

Este procedimiento actualizará el salario de todos los agentes incrementándolo en un 10%.

DELIMITER //

CREATE PROCEDURE incrementar_salario()
BEGIN
    DECLARE agente_id INT DEFAULT 0;
    DECLARE total_agentes INT;

    SET total_agentes = (SELECT COUNT(*) FROM Agentes);

    WHILE agente_id < total_agentes DO
        SET agente_id = agente_id + 1;
        UPDATE Agentes
        SET salario = salario * 1.10
        WHERE id_agente = agente_id;
    END WHILE;
END //

DELIMITER ;

Invocación de Procedures

Para ejecutar estos procedimientos, simplemente utilizamos la sentencia CALL:

CALL contar_casos_por_agente();
CALL incrementar_salario();

Conclusión

La creación de procedimientos almacenados en MySQL utilizando bucles WHILE permite ejecutar operaciones repetitivas de manera eficiente. Aunque MySQL no soporta bucles FOR de forma nativa, se pueden implementar fácilmente utilizando la estructura de bucles WHILE. Estos procedimientos son útiles para realizar tareas como la actualización de registros, cálculos acumulativos, y otras operaciones que requieren iteración sobre conjuntos de datos. La base de datos «Comisaria» proporciona un excelente marco para entender y aplicar estos conceptos en un entorno real.

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