Procedimientos y funciones. Cursores con parámetros
Objetivo:
- Implementar funciones y procedimientos.
- Utilizar cursores con parámetros.
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.
- 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:
- numgrupo de tipo numero de tamaño 1.
- nombreAsignatura del tipo nombre de la tabla ASIGNATURAS
- 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
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
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;
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 IS4.- Crear el procedimiento 3 sin llamar al generado en 2 y usando cursores con parámetros.
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;
// Este estaba mal, cuando lo corrija lo subo denuevo...
No hay comentarios:
Publicar un comentario