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:
- codigo de tipo cadena de longitud fija e igual a 10.
- nombre de tipo cadena de longitud variable y máximo 50.
- El atributo codigo es clave primaria
- Tabla DOCENCIA con las siguientes especificaciones:
- codigoProfesor de tipo codigo de la tabla PROFESOR.
- nombreAsignatura de tipo nombre de la tabla ASIGNATURAS
- 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.