lunes, 5 de noviembre de 2007

Practica 3 de DSI

Primeros pasos en PL/SQL
Objetivos
• Realizar el primer código en PL/SQL.
• Implementar funciones y procedimientos en PL/SQL.

Actividad
Se dispone de la tabla aula y de la tabla asignaturas. Se desea asignar horarios de manera que a cada asignatura se le asigne un aula a una determinada hora. Para ello se construye una relación
denominada horario entre aula y asignatura, que se implementará mediante la tabla HORARIO.

Esta tabla debe rellenarse en base al siguiente algoritmo:
Mientras queden asignaturas por asignar aula y aulas disponibles obtener siguiente asignatura obtener siguiente par
insertar tupla en la tabla HORARIO

1.- Eliminar la clave ajena a aula de la tabla asignaturas.

2.- Crear la tabla HORARIO, con las siguientes especificaciones:
Campos:
-codigoAula del tipo codigo de la tabla AULAS
-nombreAsignatura del tipo nombre de la tabla ASIGNATURAS
-hora de tipo entero con rango 1 a 5, minimizando el espacio requerido para éste

Restricciones:
-El par ha de ser único
-El par ha de ser único
-El par será clave primaria.
-codigoAula será clave ajena a codigo de la tabla AULAS
-nombreAsignatura será clave ajena a nombre de la tabla ASIGNATURAS

3.- Generar el código PL/SQL que rellene de la forma indicada la tabla HORARIO.
declare
horaactual horario.hora%TYPE;

cursor lasig IS select nombre from asignaturas;
maasig lasig%ROWTYPE;

cursor laula IS select codigo from aulas;
maaula laula%ROWTYPE;


begin
open lasig;
open laula;

fetch laula INTO maaula;
fetch lasig INTO maasig;

horaactual := 1;

WHILE laula%FOUND AND lasig%FOUND LOOP
INSERT INTO horario (CODIGOAULA,NOMBREASIGNATURA,HORA)
VALUES (maaula.codigo ,maasig.nombre, horaactual );

horaactual := horaactual + 1;
fetch lasig INTO maasig;
if horaactual >5 then
horaactual := 1;
fetch laula INTO maaula;
end if;
END LOOP;
END;
4.- Crear un procedimiento denominado generaHorario que utilice el código generado en el punto 3.

CREATE OR REPLACE PROCEDURE generaHorario IS
horaactual horario.hora%TYPE;

cursor lasig IS select nombre from asignaturas;
maasig lasig%ROWTYPE;

cursor laula IS select codigo from aulas;
maaula laula%ROWTYPE;


begin
open lasig;
open laula;

fetch laula INTO maaula;
fetch lasig INTO maasig;

horaactual := 1;

WHILE laula%FOUND AND lasig%FOUND LOOP
INSERT INTO horario (CODIGOAULA,NOMBREASIGNATURA,HORA)
VALUES (maaula.codigo ,maasig.nombre, horaactual );

horaactual := horaactual + 1;
fetch lasig INTO maasig;
if horaactual >5 then
horaactual := 1;
fetch laula INTO maaula;
end if;
END LOOP;
END;
5.- Crear una función denominada consultaAula que recibe por parámetro el nombre de una asignatura y devuelve el código del aula de dicha asignatura.
CREATE OR REPLACE FUNCTION consultaAula (argumento1 IN horario.NOMBREASIGNATURA%TYPE)

RETURN horario.codigoaula%TYPE
IS
cod horario.codigoaula%TYPE;

begin
Select horario.codigoaula into cod
from horario
where argumento1 = horario.NOMBREASIGNATURA;
RETURN cod;
END;

No hay comentarios: