martes, 20 de noviembre de 2007

Practica 5 de DSI

Procedimientos y funciones. Cursores con parámetros

Objetivo:

  • Implementar funciones y procedimientos.
  • Utilizar cursores con parámetros.
Actividad:
La explosión demográfica ha causado que las aulas se saturen. Por tanto es necesario incrementar los grupos de clases de cada asignatura, disminuyendo de esta manera el ratio alumno/grupo asignatura.

Los criterios a utilizar para realizar esta labor son los siguientes:
  • Para teoría, cada grupo tiene un máximo de 4 alumnos.
  • Se rellena siempre un grupo antes de empezar un nuevo grupo, admitiéndose como mucho un grupo de teoría no completo.
Para implementar esta nueva normativa se utilizan las siguientes tablas:
  • La tabla ESTUDIANTES ya disponible hasta ahora
  • La tabla MATRICULA ya disponible hasta ahora.
  • La tabla ASIGNATURAS ya disponible hasta ahora
  • La tabla GRUPOS, de nueva creación, con las siguientes especificaciones:
Campos:
    • numgrupo de tipo numero de tamaño 1.
    • nombreAsignatura del tipo nombre de la tabla ASIGNATURAS
Restricciones:
    • El par es clave primaria
    • nombreAsignatura será clave ajena a nombre de la tabla ASIGNATURAS
  • La tabla GRUPOSMATRICULA, también de nueva creación, con las siguientes
especificaciones:
Campos:
    • nmatEstudiante del tipo nmat de la tabla ESTUDIANTES
    • numgrupoGrupos del tipo numgrupo de la tabla GRUPOS
    • nombreAsignaturaGrupos del tipo nombre de la tabla ASIGNATURAS

Restricciones:
    • El trio es clave primaria
    • nmatEstudiante será clave ajena a nmat de la tabla ESTUDIANTES
    • El par será clave ajena al par de la tabla GRUPOS
Se pide:
1.- Crear un procedimiento que asigne a un alumno un grupo de teoría que se pasa por parámetro, insertando el correspondiente registro de grupomatricula.
CREATE OR REPLACE PROCEDURE asignaEstudianteGrupo (NmatStu IN estudiantes.NMAT%TYPE, ngrupo IN grupo.NUMGRUPO%TYPE, nomasiggrup IN grupo.NOMBREASIGNATURA%TYPE)IS
begin
INSERT INTO GRUPOSMATRICULA (NMATESTUDIANTE,NUMGRUPOGRUPOS,NOMBREASIGNATURAGRUPOS) VALUES(NmatStu, ngrupo, nomasiggrup);

END;
2.- Crear un procedimiento que para una asignatura determinada que se pasa por parámetro genere todos los grupos de teoría, insertando los registros en la tabla grupos, y asignándoles alumnos.
CREATE OR REPLACE PROCEDURE GENERAGRUPOSTEORIAASIGNATURA(nombreAsig IN ASIGNATURAS.NOMBRE%TYPE)IS
grupoactual GRUPO.NUMGRUPO%TYPE;
numAlumnos NUMBER;

cursor lestu IS select NMATESTUDIANTE from MATRICULA where NOMBREASIGNATURA = nombreAsig;
maestu lestu%ROWTYPE;

begin
open lestu;
fetch lestu INTO maestu;


grupoactual := 1;
numAlumnos := 0;

INSERT INTO GRUPO (NUMGRUPO, NOMBREASIGNATURA) Values ( grupoactual, nombreAsig);
WHILE lestu%FOUND LOOP
asignaEstudianteGrupo(maestu.NMATESTUDIANTE, grupoactual, nombreAsig);
numAlumnos := numAlumnos + 1;
fetch lestu INTO maestu;
if numAlumnos >3 then
numAlumnos := 0;
grupoactual := grupoactual + 1;
INSERT INTO GRUPO (NUMGRUPO, NOMBREASIGNATURA) Values ( grupoactual, nombreAsig);
end if;

END LOOP;
END;

3.- Crear un procedimiento que asigne a todas y cada una de las asignaturas los grupos de teoría necesarios.

CREATE OR REPLACE PROCEDURE GENERAGRUPOSTEORIA IS
cursor lasig IS select NOMBRE from ASIGNATURAS;
maasig lasig%ROWTYPE;

begin
open lasig;
fetch lasig INTO maasig;

WHILE lasig%FOUND LOOP
GENERAGRUPOSTEORIAASIGNATURA(maasig.nombre);
fetch lasig INTO maasig;
END LOOP;
END;
4.- Crear el procedimiento 3 sin llamar al generado en 2 y usando cursores con parámetros.

// Este estaba mal, cuando lo corrija lo subo denuevo...

No hay comentarios: