/*
* 4. Crear un paquete llamado "competición" en el que se defina,
* una función llamada "get_partidos" dicha función ha de devolver los
* 5 últimos partidos de una determinada competición.
* La información a devolver deberá ser almacenada en una estructura de datos
* de tipo VARRAY
* El tipo de competición ha de ser validado, lanzando un error en caso de
* introducir un tipo de competición no valido en la base de datos y mostrando
* un error por pantalla
*/
CREATE OR REPLACE PACKAGE competicion IS
-- Creación del tipo de datos de retorno
TYPE varray_partidos IS VARRAY(5) OF PARTIDOS%ROWTYPE;
-- Función que nos devolverá los 5 últimos partidos de una competición
FUNCTION get_partidos(pv_competicion IN VARCHAR) RETURN VARRAY_PARTIDOS;
competicion_not_found EXCEPTION;
END competicion;
/
CREATE OR REPLACE PACKAGE BODY competicion IS
-- Cuerpo de GET_PARTIDOS
FUNCTION get_partidos(pv_competicion IN VARCHAR) RETURN VARRAY_PARTIDOS IS
/**
* En este cursor seleccionamos los partidos de una determinada competición
* y los ordenamos por fecha
*/
CURSOR cur_partidos IS
SELECT *
FROM partidos p
WHERE LOWER(p.competicion) = LOWER(pv_competicion)
ORDER BY p.fecha DESC;
-- Array donde almacenaremos los resultados
l_array_partidos VARRAY_PARTIDOS;
-- Variable donde almacenaremos los registros la tabla partido
lr_partidos PARTIDOS%ROWTYPE;
-- Contador de resgistros
contador PLS_INTEGER := 0;
BEGIN
-- En el caso de que la competición sea 'Liga' o 'Copa'
IF LOWER(pv_competicion) = 'liga' OR LOWER(pv_competicion) = 'copa' THEN
-- Inicializamos el array
l_array_partidos := varray_partidos();
-- Abrimos el cursor
OPEN cur_partidos;
LOOP
-- Procesamiento de la línea
FETCH cur_partidos INTO lr_partidos;
/*
* Exit si no encuentra datos o si contador es mayor
* que el límite del array
*/
EXIT WHEN cur_partidos%NOTFOUND OR contador >= l_array_partidos.LIMIT;
-- Incrementamos el contador
contador := contador + 1;
-- Creamos la posición dentro del array
l_array_partidos.EXTEND;
-- Llenamos esa posición
l_array_partidos(contador) := lr_partidos;
END LOOP;
-- Cerramos cursor
CLOSE cur_partidos;
-- Devolvemos el resultado
RETURN l_array_partidos;
ELSE -- Si no lanzamos excepción
RAISE competicion_not_found;
END IF;
END get_partidos;
END competicion;
No hay comentarios:
Publicar un comentario