Paquetes, Excepciones y Referencias a Cursor
Objetivo:- Crear y usar paquetes
- Manejar excepciones
- Utilizar referencias a cursor.
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
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.
5. Añadir el procedimiento y la excepción anteriores al paquete creado con anterioridad.(
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;
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.
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!!!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;
Puede ocurrir que un profesor que no se llame Romeo ya imparta esta asignatura.