Ejercicios Prácticos de Procedimientos Almacenados y Funciones en SQL

Informática3,98 KB

Ejercicios Prácticos de SQL

Ejercicio 9: Actualización de Empleados por Departamento

CREATE PROCEDURE actualiza_empleados
AS
BEGIN
    DECLARE @departamento_id INT;
    DECLARE @contador INT;

    -- Crear un cursor para recorrer la tabla departamentos
    DECLARE departamento_cursor CURSOR FOR
    SELECT id FROM departamentos;

    OPEN departamento_cursor;

    FETCH NEXT FROM departamento_cursor INTO @departamento_id;

    WHILE @@FETCH_STATUS = 0
    BEGIN
        -- Contar el número de empleados asignados a cada departamento
        SELECT @contador = COUNT(*) 
        FROM empleados 
        WHERE id_departamento = @departamento_id;

        -- Actualizar el campo num_empleados en la tabla departamentos
        UPDATE departamentos 
        SET num_empleados = @contador 
        WHERE id = @departamento_id;

        FETCH NEXT FROM departamento_cursor INTO @departamento_id;
    END

    CLOSE departamento_cursor;
    DEALLOCATE departamento_cursor;
END;

Ejercicio 1: Cálculo del Área de un Triángulo

DELIMITER // 
CREATE PROCEDURE CalcularAreaTriangulo(IN base FLOAT, IN altura FLOAT, OUT area FLOAT) 
BEGIN 
    SET area = (base * altura) / 2; 
END // 
DELIMITER ;

Ejercicio 10: Cálculo de la Nota Media de Estudiantes

DELIMITER //

CREATE PROCEDURE calcularNotaMedia()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE dni_var CHAR(9);
    DECLARE nota_sum DECIMAL(10,2);
    DECLARE nota_count INT;
    DECLARE nota_media DECIMAL(4,2);

    DECLARE cur CURSOR FOR SELECT dni FROM estudiantes;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN cur;
    calculo: LOOP
        FETCH cur INTO dni_var;
        IF done THEN
            LEAVE calculo;
        END IF;

        SET nota_sum = 0;
        SET nota_count = 0;
        INNER_LOOP: LOOP
            SELECT SUM(nota), COUNT(*) INTO nota_sum, nota_count
            FROM calificaciones
            WHERE fk_estudiante = dni_var;
            EXIT INNER_LOOP;
        END LOOP;
        IF nota_count > 0 THEN
            SET nota_media = nota_sum / nota_count;
        ELSE
            SET nota_media = 0;
        END IF;
        UPDATE estudiantes
        SET nota_media = nota_media
        WHERE dni = dni_var;
    END LOOP calculo;

    CLOSE cur;
END//

DELIMITER ;

Ejercicio 5: Determinación del Estado de un Pedido

DELIMITER // 
CREATE FUNCTION DeterminarEstadoPedido(pedido_id INT) RETURNS VARCHAR(50) 
BEGIN 
    DECLARE cantidad_pedido INT; 
    DECLARE estado_pedido VARCHAR(50); 
     
    -- Obtener la cantidad de productos solicitados en el pedido 
    SELECT cantidad INTO cantidad_pedido FROM pedidos WHERE id = pedido_id; 
     
    -- Determinar el estado del pedido según la cantidad 
    IF cantidad_pedido > 100 THEN 
        SET estado_pedido = 'Grande'; 
    ELSEIF cantidad_pedido BETWEEN 51 AND 100 THEN 
        SET estado_pedido = 'Mediano'; 
    ELSE 
        SET estado_pedido = 'Pequeño'; 
    END IF; 
     
    -- Devolver el resultado 
    RETURN estado_pedido; 
END // 
DELIMITER ;

Ejercicio 7: Cálculo de Partidos Jugados por Jugador

DELIMITER // 
CREATE PROCEDURE CalcularPartidosJugados() 
BEGIN 
    DECLARE jugador_id INT; 
    DECLARE contador_partidos INT; 
    DECLARE done INT DEFAULT FALSE; 
     
    -- Cursor para recorrer la tabla de jugadores 
    DECLARE cur CURSOR FOR SELECT id FROM jugadores;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN cur;
    read_loop: LOOP
        FETCH cur INTO jugador_id;
        IF done THEN
            LEAVE read_loop;
        END IF;

        -- Contar el número de partidos jugados por el jugador
        SELECT COUNT(*) INTO contador_partidos FROM partidos_jugados WHERE fk_jugador = jugador_id;

        -- Actualizar el campo num_partidos del jugador
        UPDATE jugadores SET num_partidos = contador_partidos WHERE id = jugador_id;
    END LOOP;
    CLOSE cur;
END //
DELIMITER ;

Descargar

PDF Word HTML