jueves, 5 de diciembre de 2013

pack4 ex

/*
 * 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