You are on page 1of 9

UNIVERSIDAD NACIONAL EXPERIMENTAL DEL TCHIRA Tercer Examen Parcial de Base de Datos Ponderacin 35% Apellidos y Nombres: ________________________________________

C.I. N: ________________ Fecha: 22/03/2009 Seccin: _____

Instrucciones: Lea detenidamente los planteamientos presentados a continuacin, en cada uno de ellos se le muestran situaciones diferentes que usted deber resolver, de acuerdo a lo visto en clases y a travs de los diversos ejercicios planteados por su profesor. Cree un archivo de texto en el escritorio con su nombre y su nmero de cedula (Ejemplo: Pedro Prez 17370421), en el coloque las sentencias asociadas con cada instruccin del parcial, cuando finalice el parcial, arrastre dicho archivo a la siguiente direccin de acuerdo a la seccin en la que ve clase: \\nimrod\evaluaciones\Base de Datos I\Prof. Jos Orlando Figueroa \\nimrod \evaluaciones\Base de Datos I\Prof. Mary Carlota Bernal Revise detenidamente el siguiente modelo fsico

DEPARTAMENTOS (DEPT) PK * codigo * nombre

FK1=PROF_DEPT _FK

PK

MATERIAS (MAT) * codigo * nombre * horas

PK

DEDICACIONES (DED) * codigo * nombre * horas


FK1=PAL_ACT _FK

PROFESORES (PROF) * codigo * nombre * apellido FK1 * dept_id FK2 * ded_id * fecha_ini PK
FK2=PAL_PROF _FK

FK2=PML_PROF _FK

FK1=PML_MAT_ FK

FK2=PROF_DED _FK

PROF_MATERIA_LAPSO (PML) PK, FK1 * mat_cod PK, FK2 * prof_cod PK, FK3 * lap_cod

ACTIVIDADES (ACT) PK * codigo UK * descripcion * duracion * tipo

PROF_ACT_LAPSO (PAL) Pk * num PK, FK1 * act_codigo PK, FK2 * prof_cod PK, FK3 * lap_cod * descripcion

FK3=PAL_LAP _FK

FK3=PML_LAP_ FK

PK

LAPSOS * * *

(LAP) codigo fecha_ini fecha_fin

Figura #1

Parte I. Valor 55 ptos.

Realice las siguientes sentencias de acuerdo con el numero en que finaliza su cedula de identidad Si su cedula termina en 1, 3, 6 y 8 realice las consultas pertenecientes al grupo 1 Si su cedula termina en 7, 4, 9 realice las consultas pertenecientes al grupo 2 Si su cedula termina en 0, 2, 5 realice las consultas pertenecientes al grupo 3 Grupo 1: 1. Funcin que retorna la carga acadmica (actividades y materias de un docente dado por parmetro su codigo y el lapso acadmico. Valor 15 ptos Create or replace function carga (p_codigo IN profesores.codigo% TYPE, P_lapso IN lapsos.codigo%TYPE) Return number IS v_materias number(4); v_actividades number(4); v_total number(4); BEGIN select sum(horas) from profesores p, materias m, lapsos l, prof_materia_lapso o where o.prof_cod=p.codigo and o.lap_cod=l.codigo and o.mat_cod=m.codigo and p.codigo=p_codigo and l.codigo=p_lapso; Select sum(duracion) into v_actividades From profesores p, actividades a, lapsos l, prof_act_lapso o Where o.prof_cod=p.codigo and o.lap_cod=l.codigo and o.act_codigo=a.codigo and p.codigo=p_codigo and l.codigo=p_lapso; v_total:= v_materias + v_actividades; DBMS_OUTPUT.PUT_LINE(v_total); return (v_total); END carga; Ejecucion: variable x number EXECUTE :x:=carga(0001,20093); PRINT x 2. Realice un procedimiento que muestre el siguiente listado Departamento: Ingeniera Informtica Docente: Pedro Prez

Materia que Dicta Horas Xxxxxxxxxxxxxxx xxx Docente : yyyyyyy ... Departamento: xxxxxxxxxxxx Valor 20 pts

Lapso xxxx

Create or replace procedure listado IS Cursor departamentos IS Select d.codigo codigo, d.nombre departamento From departamentos d Order by d.codigo; Cursor docentes (c varchar2) IS Select p.codigo codigo, p.nombre nombre, p.apellido apellido From profesores p, departamentos d Where p.dept_id=d.codigo and d.codigo=c; Cursor materias (d varchar2) IS Select m.nombre nombre, m.horas horas, l.codigo lapso From profesores p, materias m, lapsos l, prof_materia_lapso o Where o.prof_cod=p.codigo and o.lap_cod=l.codigo and o.mat_cod=m.codigo and p.codigo=d; var2 docentes%rowtype; var3 materias%rowtype; BEGIN FOR var IN departamentos LOOP DBMS_OUTPUT.PUT_LINE('Departamento: ' || var.departamento); OPEN docentes(var.codigo); LOOP FETCH docentes into var2 ; EXIT WHEN docentes%NOTFOUND; DBMS_OUTPUT.PUT_LINE('Profesor: ' || var2.nombre || ' ' || var2.apellido); DBMS_OUTPUT.PUT_LINE('Materia ' || 'Horas ' || 'Lapso '); OPEN materias(var2.codigo); LOOP FETCH materias into var3 ; EXIT WHEN materias%NOTFOUND; DBMS_OUTPUT.PUT_LINE(var3.nombre || ' ' || var3.horas || ' ' || var3.lapso); END LOOP; CLOSE materias;

END LOOP; CLOSE docentes; END LOOP; END listado; / Ejecucion: SET SERVEROUTPUT ON EXECUTE listado; 3. Realice un Disparador de Base de Datos (trigger) que no permita ingresar ms de tres actividades deportivas para un docente en un lapso acadmico Valor 20 pts Create or replace trigger actividades BEFORE insert on prof_act_lapso FOR EACH ROW BEGIN IF (verifica(:NEW.prof_cod, :NEW.lap_cod)>=3) THEN RAISE_APPLICATION_ERROR(-1234,'Error no puede ingresar ms de tres actividades deportivas para un docente'); END IF; END; / Create or replace function verifica (p_cod varchar2, p_lap varchar2) RETURN number IS var number(4); BEGIN Select count(*) into var from actividades a, lapsos l, profesores p, prof_act_lapso o where o.act_codigo=a.codigo and o.prof_cod=p.codigo and o.lap_cod=l.codigo and p.codigo=p_cod and a.descripcion='Actividades Deportivas' and o.lap_cod=p_lap; return var; END; Grupo 2: 1. Funcin que muestre dado un departamento y el lapso acadmico el porcentaje de profesores que cumplen con su carga acadmica (materias y actividades) Valor 20 pts

2. Realice un procedimiento que muestre los docentes que dan menos de 6, entre 6 y 12 y ms de 12 horas de clase agrupados por lapso Valor 20 pts Lapso : 20093 Menos de 6 horas Nombre Xxxxxxxxxxxxxxx Entre 6 y 12 horas Nombre Xxxxxxxxxxxxxxx Mas de 12 horas Lapso : 20083 ..

Apellido xxx Apellido xxx

Dedicacin xxxx Dedicacin xxxx

3. Realice una tabla de auditora para la tabla prof_materia_lapso, guarde la operacin, el nombre del usuario y la fecha de modificacin junto con todos los datos modificados. Valor 15 pts CREATE TABLE AUDITORIA (MAT_COD VARCHAR(4), PROF_COD VARCHAR2(4), LAP_COD VARCHAR2(6), FECHADATE, USUARIO VARCHAR2(30), OPERACION VARCHAR2(20)); CREATE OR REPLACE PROCEDURE ADD_AUDITORIA( mat_cod PROF_MATERIA_LAPSO.MAT_COD%TYPE, prof_cod PROF_MATERIA_LAPSO.PROF_COD%TYPE, lap_cod PROF_MATERIA_LAPSO.LAP_COD%TYPE, operacion VARCHAR2) IS BEGIN INSERT INTO AUDITORIA (mat_cod, prof_cod, lap_cod, fecha, usuario, operacion) VALUES (mat_cod, prof_cod, lap_cod, SYSDATE, USER, operacion); END; / CREATE OR REPLACE TRIGGER MAT_LAP AFTER INSERT OR UPDATE OR DELETE ON PROF_MATERIA_LAPSO

FOR EACH ROW BEGIN IF INSERTING THEN ADD_AUDITORIA(:NEW.MAT_COD,:NEW.PROF_COD,:NEW.LAP_COD, 'INSERTING'); ELSIF UPDATING THEN ADD_AUDITORIA(:NEW.MAT_COD,:NEW.PROF_COD,:NEW.LAP_COD, 'UPDATING'); ELSIF DELETING THEN ADD_AUDITORIA(:OLD.MAT_COD,:OLD.PROF_COD,:OLD.LAP_COD, 'DELETING'); END IF; END; Grupo 3: 1. Funcin que calcule dado un departamento y el lapso acadmico el porcentaje de profesores que cumplen con los 3 tipos de actividades (I: Investigacin, E: Extensin, D: Docencia) Valor 15 pts CREATE OR REPLACE FUNCTION calc ( dept departamentos.codigo%TYPE, lap lapsos.codigo%TYPE ) RETURN NUMBER IS porcentaje number(5,2); cont1 number(2):=0; cont2 number(2):=0; b1 BOOLEAN:=FALSE; b2 BOOLEAN:=FALSE; b3 BOOLEAN:=FALSE; CURSOR cprof IS SELECT codigo FROM profesores WHERE dept_id=dept; CURSOR cpal IS SELECT act_codigo,prof_cod FROM prof_act_lapso WHERE lap_cod=lap; CURSOR cact IS SELECT codigo,tipo FROM actividades; BEGIN

FOR profe IN cprof LOOP cont1:=cont1+1; b1:=false; b2:=false; b3:=false; FOR prt IN cpal LOOP IF profe.codigo=prt.prof_cod THEN FOR act IN cact LOOP IF act.codigo=prt.act_codigo THEN IF act.tipo='I' THEN b1:=true; END IF; IF act.tipo='E' THEN b2:=true; END IF; IF act.tipo='D' THEN b3:=true; END IF; END IF; END LOOP; END IF; END LOOP; IF b1=true and b2=true and b3=true THEN cont2:=cont2+1; END IF; END LOOP; porcentaje:=(cont2/cont1)*100; RETURN porcentaje; END calc; / 2. Realice un procedimiento que muestre los departamentos, sus profesores y las actividades que desempean Valor 20 pts Departamento: Ingeniera Informtica Docente: Pedro Prez Actividades Tipo Descripcin Xxxxxxxxxxxxxxxxxx Xxxxxxxxxxxxxxxxxx Docente : yyyyyyy ... Departamento: xxxxxxxxxxxx

Duracin xxxx xxxx xxxxxxxx xxxxxxxx

Create or replace procedure listado_actividades IS Cursor departamentos IS Select d.codigo codigo, d.nombre departamento

From departamentos d Order by d.codigo; Cursor docentes (c varchar2) IS Select p.codigo codigo, p.nombre nombre, p.apellido apellido From profesores p, departamentos d Where p.dept_id=d.codigo and d.codigo=c; Cursor actividades (d varchar2) IS Select a.descripcion descripcion, a.duracion duracion, a.tipo tipo From profesores p, actividades a, lapsos l, prof_act_lapso o Where o.prof_cod=p.codigo and o.lap_cod=l.codigo and o.act_codigo=a.codigo and p.codigo=d; var2 docentes%rowtype; var3 actividades%rowtype; BEGIN FOR var IN departamentos LOOP DBMS_OUTPUT.PUT_LINE('Departamento: ' || var.departamento); OPEN docentes(var.codigo); LOOP FETCH docentes into var2 ; EXIT WHEN docentes%NOTFOUND; DBMS_OUTPUT.PUT_LINE('Profesor: ' || var2.nombre || ' ' || var2.apellido); DBMS_OUTPUT.PUT_LINE('Actividades ' || 'Duracion ' || 'Tipo '); OPEN actividades(var2.codigo); LOOP FETCH actividades into var3 ; EXIT WHEN actividades%NOTFOUND; DBMS_OUTPUT.PUT_LINE(var3.descripcion || ' ' || var3.duracion || ' ' || var3.tipo); END LOOP; CLOSE actividades; END LOOP; CLOSE docentes; END LOOP; END listado_actividades; 3. Realice una Disparador de Base de Datos (trigger) que valide que no se puedan insertar actividades con ms de 15 horas en aquellas actividades que son de tipo Investigacin y Extensin. Valor 20 pts

EXITOS