martes, 18 de diciembre de 2007

Practica 6 de DSI

Paquetes, Excepciones y Referencias a Cursor
Objetivo:
  • Crear y usar paquetes
  • Manejar excepciones
  • Utilizar referencias a cursor.
Actividad:

Ahora solamente falta guardar la información referente a las asignaturas que imparten los
profesores. Para ello se necesitan crear las siguientes tablas:
  • Tabla PROFESOR con las siguientes especificaciones:
  • Campos:
    • codigo de tipo cadena de longitud fija e igual a 10.
    • nombre de tipo cadena de longitud variable y máximo 50.
  • Restricciones:
    • El atributo codigo es clave primaria

  • Tabla DOCENCIA con las siguientes especificaciones:
  • Campos:
  • codigoProfesor de tipo codigo de la tabla PROFESOR.
  • nombreAsignatura de tipo nombre de la tabla ASIGNATURAS
  • Restricciones:
  • El par es clave primaria
  • codigoProfesor será clave ajena a codigo de la tabla PROFESOR
  • nombreAsignatura será clave ajena a nombre de la tabla ASIGNATURAS
1. Implementa el siguiente código acerca de la creación de subtipos.
SET SERVEROUTPUT ON FORMAT WRAP;
DECLARE
--Definición de un tipo entero propio. No se puede definir tamaño
subtype entero is number;
--El tamaño se asigna después, al crear variables de dicho subtipo
coco number(2);
--Puedo dotar de tamaño a un subtipo con un truco: declarar una variable tipo ...
nameType VARCHAR2(50);
-- y usar el atributo %TYPE !!!
SUBTYPE name IS nameType%TYPE;
codeType CHAR(10);
SUBTYPE code IS codeType%TYPE;
codigo code;
nombre name;
BEGIN
codigo:=1;
nombre:='Elena';
dbms_output.put_line(codigo || ' ' || nombre);
END;

2. Crear un paquete llamado unpaquete con los tipos code y name. Crear también un procedimiento que utilizando dicho paquete reproduzca las declaraciones del punto 1.

3. Crear las tablas PROFESOR y DOCENCIA. Intentar utilizar para ellos los tipos definidos en el
punto 2. ¿Qué ocurre? ¿Por qué?
Insertar las siguientes tuplas en las tablas PROFESOR y DOCENCIA:
insert into profesor values (‘666’, ‘Cuco Valoy’);
insert into profesor values ( ‘42’, ‘Alfa’);
insert into profesor values ( ‘323’, ‘Romeo’);
insert into profesor values ( ‘435’, ‘Julieta’);
insert into docencia values ( ‘323’,’MP1’);
insert into docencia values ( ‘42’,’L’);
insert into docencia values ( ‘435’, ‘SO’);

4. La Universidad ha decidido que en lo sucesivo no quiere ningún Romeo dando más clases de las que hasta ahora imparte. Crear un procedimiento que asigne docencia de una asignatura a un profesor, y que si se llama Romeo entonces genere una excepción. En dicho caso se debe asignar la docencia al profesor Cuco Valoy.
(
codAsig in docencia.nombreasignatura%type, nomProf in profesor.nombre%type
)
as
excepcionRomeo EXCEPTION;
codProf docencia.codigoProfesor%TYPE;
codigoCuco docencia.codigoProfesor%TYPE;
begin
SELECT codigo into codigoCuco
FROM Profesor
WHERE nombre='Cuco Valoy';
SELECT codigo into codProf
FROM Profesor
WHERE nombre=nomProf;
if nomProf='Romeo' then
RAISE excepcionRomeo;
end if;
insert into docencia values (codProf,codAsig);
EXCEPTION
when excepcionRomeo then
insert into docencia values (codigoCuco,codAsig);
end;
5. Añadir el procedimiento y la excepción anteriores al paquete creado con anterioridad.
AS
PROCEDURE noRomeo (
codAsig in docencia.nombreasignatura%type, nomProf in profesor.nombre%type
)
as
excepcionRomeo EXCEPTION;
codProf docencia.codigoProfesor%TYPE;
codigoCuco docencia.codigoProfesor%TYPE;
begin
SELECT codigo into codigoCuco
FROM Profesor
WHERE nombre='Cuco Valoy';
SELECT codigo into codProf
FROM Profesor
WHERE nombre=nomProf;
if nomProf='Romeo' then
RAISE excepcionRomeo;
end if;
insert into docencia values (codProf,codAsig);
EXCEPTION
when excepcionRomeo then
insert into docencia values (codigoCuco,codAsig);
end noRomeo;
end unpaquete;

6. Añadir al mismo paquete una función que devuelva en un cursor todos los registros de la tabla profesor que no se llamen Romeo.

AS
PROCEDURE noRomeo (
codAsig in docencia.nombreasignatura%type, nomProf in profesor.nombre%type
)
as
excepcionRomeo EXCEPTION;
codProf docencia.codigoProfesor%TYPE;
codigoCuco docencia.codigoProfesor%TYPE;
begin
SELECT codigo into codigoCuco
FROM Profesor
WHERE nombre='Cuco Valoy';
SELECT codigo into codProf
FROM Profesor
WHERE nombre=nomProf;
if nomProf='Romeo' then
RAISE excepcionRomeo;
end if;
insert into docencia values (codProf,codAsig);
EXCEPTION
when excepcionRomeo then
insert into docencia values (codigoCuco,codAsig);
end noRomeo;
function referenciaCursor return referenciaCursorProfesores
IS
retorno referenciaCursorProfesores;
begin

OPEN retorno FOR
SELECT *
FROM profesor
WHERE nombre <> 'Romeo';

return retorno;
end referenciaCursor;
end unpaquete;
7. Añadir al mismo paquete un procedimiento que haga que todos los profesores que no se llamen Romeo devueltos por la función creada en el punto 6 impartan la asignatura de ‘MP1’. Atención!!!

Puede ocurrir que un profesor que no se llame Romeo ya imparta esta asignatura.

1 comentario:

Jose Ruiz dijo...

Planteate si eso le interesa a alguien antes de escribirlo, paquete
k eres un gentuzo

Soy tu antiguo primo preferido

Un beso y te toca venir a verme