Sunteți pe pagina 1din 11

Escuela de Informtica y Telecomunicaciones

GUA DE PL/SQL N5
USANDO CURSORES EXPLCITOS
El proceso automtico que Ud. construy para el clculo de promedios del colegio SAN JUAN ya fue ejecutado por
cada docente y se obtuvieron las notas promedios para cada una de las asignaturas de los alumnos. Almacenada
esta informacin en la Base de Datos y basados en el Modelo que se muestra a continuacin, deber satisfacer los
requerimientos de informacin planteados en cada caso y que son parte del acuerdo contractual entre Ud. y la
direccin del colegio:

Para crear y poblar las tablas del Modelo efecte lo siguiente:


Conctese
a
la
base
de
datos
como
usuario
SYSTEM
y
ejecute
el
archivo
script_creacin_usuario_gua_PLSQL_N5 que crear el usuario p_plsq5 password practica.
Conctese posteriormente como usuario p_plsq5 y ejecute el archivo script_creacin_tablas_gua_PLSQL_N5
para crear y poblar las tablas del Modelo como se muestra en el ejemplo:
TABLA CURSO

TABLA ASIGNATURA

TABLA ALUMNO

Escuela de Informtica y Telecomunicaciones

TABLA PROFESOR

TABLAS PROMEDIO_ASIG_ALUMNO

TABLA HORARIO_PROFESOR

Escuela de Informtica y Telecomunicaciones

Escuela de Informtica y Telecomunicaciones

1.- La direccin del colegio desea contar en forma urgente con un listado de la situacin de cada asignatura de los
alumnos. Por esta razn y dada la urgencia de contar esta informacin, por ahora slo es necesario que sea visualizada a
travs de un bloque PL/SQL Annimo ya que a travs de SQLDeveloper el listado tambin podr ser guardado en archivo
.txt. El informe requiere el apellido paterno y primer nombre (concatenado) del alumno, nombre de la asignatura,
promedio y situacin. Si la situacin de la asignatura es A se debe mostrar Aprobado y si es R se debe mostrar Reprobado.
La informacin se debe mostrar ordenada por apellido de alumno, nombre del alumno y nombre de la asignatura en forma
ascendente y al ejecutar el bloque se debera visualizar en el formato que se muestra en el ejemplo. Se solicita adems que
sea guardado en un archivo con el nombre listado_situacion_asig.txt.

DECLARE
CURSOR cur_emp IS
select a.appat_alumno || ' ' || a.pnombre_alumno as alumno,
asig.nombre as asignatura,
case p.situacion_asig
when 'A' then 'Aprobado'
when 'R' then 'Reprobado'
end as situacion
from promedio_asig_alumno p
join alumno a on a.cod_alumno = p.cod_alumno
join asignatura asig on asig.cod_asignatura = p.cod_asignatura
order by a.appat_alumno, a.pnombre_alumno, asig.nombre;
ORDEN NUMBER:=1;
BEGIN
DBMS_OUTPUT.PUT_LINE('LISTADO SITUACION DE ASIGNATURAS DE LOS ALUMNOS');
DBMS_OUTPUT.PUT_LINE('===============================================');
DBMS_OUTPUT.PUT_LINE(' ');
DBMS_OUTPUT.PUT_LINE('ORDEN ALUMNO
ASIGNATURA
SITUACION');
DBMS_OUTPUT.PUT_LINE('=============================================================');
FOR reg_emp IN cur_emp LOOP
DBMS_OUTPUT.PUT_LINE( TO_CHAR(ORDEN) || ' ' || reg_emp.ALUMNO || ' ' || reg_emp.ASIGNATURA || ' '
|| reg_emp.SITUACION );
ORDEN:=ORDEN+1;
END LOOP;
END;
2.- Debido a un incendio en la de profesores del colegio, los libros de clases se debieron volver a confeccionar pero la
imprenta los entregar en una semana ms. Debido a esto, se requiere poder entregar a cada profesor un listado para
registrar la asistencia a clases de los alumnos, requerimiento que le han solicitado a Ud. poder resolver.

Escuela de Informtica y Telecomunicaciones


El listado debe mostrar el rut y nombre completo del alumno adems de los das de la semana de lunes a viernes para
registrar la asistencia por cada curso. La informacin se requiere en orden alfabtico y al ejecutar el bloque PL/SQL el
listado debe mostrar la informacin para todos los cursos en el formato del ejemplo y se requiere en un archivo con el
nombre asistencia_alumnos_por_curso.txt.

Escuela de Informtica y Telecomunicaciones

DECLARE
CURSOR cursos IS
SELECT cod_curso,
descripcion
FROM curso;
CURSOR alumnos(p_curso NUMBER) IS
SELECT to_char(numrut_alumno, '999,999,999') || '-' || dvrut_alumno as rut,
trim(pnombre_alumno) || ' ' || trim(snombre_alumno) || ' ' || trim(appat_alumno) || ' ' || trim(apmat_alumno) as nombre
FROM alumno
WHERE cod_curso = p_curso;
v_nro_alumno NUMBER(2);
BEGIN
FOR reg_curso IN cursos LOOP
DBMS_OUTPUT.PUT_LINE('Asistencia '|| reg_curso.descripcion);
DBMS_OUTPUT.PUT_LINE('=====================================');
DBMS_OUTPUT.PUT_LINE('N RUT ALUMNO NOMBRE ALUMNO
LUNES MARTES
MIERCOLES JUEVES VIERNES');
DBMS_OUTPUT.PUT_LINE('==============================================================
================================');
v_nro_alumno := 0;
FOR reg_alumno IN alumnos(reg_curso.cod_curso) LOOP
v_nro_alumno := v_nro_alumno + 1;
DBMS_OUTPUT.PUT_LINE(rpad(to_char(v_nro_alumno),3,' ') || rpad(reg_alumno.rut,20,' ') ||
rpad(reg_alumno.nombre, 40,' ' ) || ' O O
O O O');
END LOOP;
DBMS_OUTPUT.PUT_LINE('============================================================
======================================');
DBMS_OUTPUT.PUT_LINE('Total Alumnos del curso: ' || v_nro_alumno);
DBMS_OUTPUT.NEW_LINE();
DBMS_OUTPUT.NEW_LINE();
END LOOP;
END;

3.- La direccin desea que automatice el proceso de clculo de promedios finales de los alumnos el que adems deber
permitir actualizar la informacin de los alumnos que mantendrn su beca de estudio en los casos que correspondan. Se

Escuela de Informtica y Telecomunicaciones


deben procesar todos los alumnos, por cada uno de ellos, y de acuerdo a las polticas del colegio, obtener la informacin
de acuerdo a las siguientes especificaciones:
1. Los valores se redondean a un decimal.
2. Si el alumno aprob todas las asignaturas, el alumno aprueba el ao acadmico (situacin final A) y si el
promedio de notas es mayor a 5,8 mantiene la beca de estudio si es que la posee (becado debe quedar S).
3. Si el alumno reprob todas sus asignaturas, el alumno reprueba el ao acadmico (situacin final R) y pierde su
beca de estudio si es que la posee (becado debe quedar NULO).
4. Si el alumno reprob ambas asignaturas cuyo cdigo finaliza en 1 2 el alumno reprueba el ao acadmico
(situacin final R) y pierde su beca de estudio si es que la posee (becado debe quedar NULO).
5. Si el alumno reprob una de las asignaturas cuyo cdigo finaliza en 1 2, pero aprob todas las otras asignaturas
y el promedio de todas las notas es superior a 5,0, el alumno aprueba el ao acadmico (situacin final A). Si el
promedio de notas es igual o inferior a 5,0 el alumno reprueba el ao acadmico ( situacin final R). En ambos
casos el alumno pierde la beca de estudio si es que la posee (becado debe quedar NULO).
6. Si el alumno reprob una de las asignaturas cuyo cdigo finaliza en 1 2, adems reprob una de las otras
asignaturas y el promedio de todas las notas es superior a 4,8, el alumno aprueba el ao acadmico ( situacin
final A). Si el promedio de notas es igual o inferior a 4,8 el alumno reprueba el ao acadmico ( situacin final
R). En ambos casos el alumno pierde la beca de estudio si es que la posee (becado debe quedar NULO).
7. Si el alumno reprob una de las asignaturas cuyo cdigo finaliza en 1 2, adems reprob ms de una de las otras
asignaturas y el promedio de todas las notas es superior a 5,0, el alumno aprueba el ao acadmico ( situacin
final A). Si el promedio de notas es igual o inferior a 5,0 el alumno reprueba el ao acadmico ( situacin final
R). En ambos casos el alumno pierde la beca de estudio si es que la posee (becado debe quedar NULO).
8. Si el alumno aprob las dos asignaturas cuyo cdigo finaliza en 1 2, pero reprob ms de una o todas las otras
asignaturas y el promedio de todas las notas es superior a 5,0, el alumno aprueba el ao acadmico ( situacin
final A) y mantiene la beca de estudio si es que la posee (becado debe quedar S). Si el promedio de notas es
igual o inferior a 5,0 el alumno reprueba el ao acadmico (situacin final R) y pierde la beca de estudio si es
que la posee (becado debe quedar NULO)
9. Si el alumno aprob las dos asignaturas cuyo cdigo finaliza en 1 2, adems aprob dos de las otras asignaturas
y el promedio de todas las notas es superior a 5,5, el alumno aprueba el ao acadmico ( situacin final A) y
mantiene la beca de estudio si es que la posee (becado debe quedar S). Si el promedio es igual o inferior a 5,5
el alumno reprueba el ao acadmico (situacin final R) y pierde su beca de estudio si es que la posee (becado
debe quedar NULO).
Al finalizar la ejecucin del bloque, el resultado debera ser el que se muestra en el ejemplo:
TABLA PROMEDIO_FINAL_ALUMNO

TABLA ALUMNO

DECLARE
CURSOR ALUMNO IS
SELECT A.COD_ALUMNO, A.COD_CURSO
FROM ALUMNO A;
CURSOR ASIGNATURA(P_COD_ALUMNO NUMBER) IS
SELECT COD_ALUMNO,
COD_ASIGNATURA,
PROMEDIO_ASIG,
SITUACION_ASIG
FROM PROMEDIO_ASIG_ALUMNO
WHERE COD_ALUMNO=P_COD_ALUMNO;
V_PROMEDIO_FINAL NUMBER;
V_SITUACION VARCHAR(01);
V_BECA VARCHAR2(01);
V_NRO_ASIG_R NUMBER(02);
V_NRO_ASIG_A NUMBER(02);
V_NRO_ASIG_OTRA NUMBER(02);
V_NRO_ASIG_OTRA_A NUMBER(02);
V_ASIG_1 VARCHAR(01);
V_ASIG_2 VARCHAR(01);
V_SITUACION_CONDICION_6 VARCHAR(01);

Escuela de Informtica y Telecomunicaciones


BEGIN
FOR R_ALUMNO IN ALUMNO LOOP
--PUNTO 1 Y 2
SELECT ROUND(AVG(PROMEDIO_ASIG),1) INTO V_PROMEDIO_FINAL
FROM PROMEDIO_ASIG_ALUMNO
WHERE COD_ALUMNO = R_ALUMNO.COD_ALUMNO;
IF V_PROMEDIO_FINAL > 5.8
THEN V_SITUACION := 'A';
V_BECA := 'S';
ELSE
V_NRO_ASIG_R := 0;
V_NRO_ASIG_A := 0;
V_NRO_ASIG_OTRA := 0;
V_NRO_ASIG_OTRA_A := 0;
FOR R_ASIG_ALUMNO IN ASIGNATURA(R_ALUMNO.COD_ALUMNO) LOOP
--- PUNTO 3
IF R_ASIG_ALUMNO.SITUACION_ASIG = 'R'
THEN V_NRO_ASIG_R := V_NRO_ASIG_R + 1;
ELSE V_NRO_ASIG_A := V_NRO_ASIG_A + 1;
END IF;
--- PUNTO 6 PARTE
IF SUBSTR(R_ASIG_ALUMNO.COD_ASIGNATURA,4,1) NOT IN ('1','2')
AND R_ASIG_ALUMNO.SITUACION_ASIG = 'R'
THEN V_SITUACION_CONDICION_6 := 'R';
--- PUNTO 7 PARTE
V_NRO_ASIG_OTRA := V_NRO_ASIG_OTRA + 1;
ELSE
---PUNTO 9
V_NRO_ASIG_OTRA_A := V_NRO_ASIG_OTRA_A + 1;
END IF;
END LOOP; --- LOOP DE ASIGNATURAS POR ALUMNO
END IF; -- PRINCIPAL
--- PUNTO 3
IF V_NRO_ASIG_R <> 0 AND V_NRO_ASIG_A = 0
THEN V_SITUACION := 'R';
V_BECA := NULL;
END IF;
--- PUNTO 4
SELECT SITUACION_ASIG INTO V_ASIG_1
FROM PROMEDIO_ASIG_ALUMNO
WHERE SUBSTR(COD_ASIGNATURA,4,1) = 1
AND COD_ALUMNO = R_ALUMNO.COD_ALUMNO;
SELECT SITUACION_ASIG INTO V_ASIG_2
FROM PROMEDIO_ASIG_ALUMNO
WHERE SUBSTR(COD_ASIGNATURA,4,1) = 2
AND COD_ALUMNO = R_ALUMNO.COD_ALUMNO;
IF V_ASIG_2 = 'R' AND V_ASIG_1 = 'R'
THEN V_SITUACION := 'R';
V_BECA := NULL;
ELSIF (V_ASIG_2 = 'R' OR V_ASIG_1 = 'R') AND V_PROMEDIO_FINAL > 5.0
THEN V_SITUACION := 'A';
V_BECA := NULL;
ELSIF (V_ASIG_2 = 'R' OR V_ASIG_1 = 'R') AND V_PROMEDIO_FINAL <= 5.0
THEN V_SITUACION := 'R';
V_BECA := NULL;
---- PUNTO 6
ELSIF (V_ASIG_2 = 'R' OR V_ASIG_1 = 'R') AND V_SITUACION_CONDICION_6 = 'R' AND V_PROMEDIO_FINAL > 4.8
THEN V_SITUACION := 'A';
V_BECA := NULL;
ELSIF (V_ASIG_2 = 'R' OR V_ASIG_1 = 'R') AND V_SITUACION_CONDICION_6 = 'R' AND V_PROMEDIO_FINAL <= 4.8
THEN V_SITUACION := 'R';
V_BECA := NULL;
---- PUNTO 7
ELSIF (V_ASIG_2 = 'R' OR V_ASIG_1 = 'R') AND V_NRO_ASIG_OTRA > 1 AND V_PROMEDIO_FINAL > 5.0
THEN V_SITUACION := 'A';
V_BECA := NULL;
ELSIF (V_ASIG_2 = 'R' OR V_ASIG_1 = 'R') AND V_NRO_ASIG_OTRA > 1 AND V_PROMEDIO_FINAL <= 5.0
THEN V_SITUACION := 'R';
V_BECA := NULL;
---- PUNTO 8
ELSIF (V_ASIG_2 = 'A' and V_ASIG_1 = 'A') AND V_NRO_ASIG_OTRA > 1 AND V_PROMEDIO_FINAL > 5.0
THEN V_SITUACION := 'A';
V_BECA := 'S';
ELSIF (V_ASIG_2 = 'A' and V_ASIG_1 = 'A') AND V_NRO_ASIG_OTRA > 1 AND V_PROMEDIO_FINAL <= 5.0
THEN V_SITUACION := 'R';
V_BECA := NULL;
---- PUNTO 9
ELSIF (V_ASIG_2 = 'A' and V_ASIG_1 = 'A') AND V_NRO_ASIG_OTRA_A >= 2 AND V_PROMEDIO_FINAL > 5.5
THEN V_SITUACION := 'A';
V_BECA := 'S';
ELSIF (V_ASIG_2 = 'A' and V_ASIG_1 = 'A') AND V_NRO_ASIG_OTRA_A >= 2 AND V_PROMEDIO_FINAL <= 5.5
THEN V_SITUACION := 'R';
V_BECA := NULL;
END IF;
--- ACTUALIZA EN LAS TABLAS DE PROMEDIO FINAL ALUMNO Y ALUMNO
UPDATE PROMEDIO_FINAL_ALUMNO
SET PROMEDIO_FINAL= V_PROMEDIO_FINAL,

Escuela de Informtica y Telecomunicaciones


SITUACION_FINAL= V_SITUACION
WHERE COD_ALUMNO = R_ALUMNO.COD_ALUMNO
AND COD_CURSO = R_ALUMNO.COD_CURSO;
IF SQL%NOTFOUND THEN
INSERT INTO PROMEDIO_FINAL_ALUMNO
VALUES(R_ALUMNO.COD_ALUMNO,R_ALUMNO.COD_CURSO,V_PROMEDIO_FINAL,V_SITUACION);
END IF;
UPDATE ALUMNO
SET BECADO = V_BECA
WHERE COD_ALUMNO = R_ALUMNO.COD_ALUMNO;
END LOOP;
COMMIT;
END;

4.- Como una forma de incentivar el buen trabajo que han desempeado los profesores durante el ao acadmico, la
direccin del colegio incluir en el salario del mes de diciembre el pago de un bono especial de acuerdo a la asignatura
que dictaron y al total de horas semanales asignadas. Por lo tanto, por cada profesor procesado, se debe calcular su bono
especial de acuerdo a las asignaturas y al total de horas semanales correspondiente a cada una de las asignaturas que dicta.
Para desarrollar este proceso, las consideraciones son las siguientes:
El clculo de cada bono por profesor debe ser almacenado en la tabla BONO_PROFESOR (redondeado) que debe
tener la siguiente estructura:

NOMBRE DE COLUMNA

TIPO DE DATO

COD_PROFESOR
HORAS_ASIG_12

Numrico de largo
(obligatorio)
Numrico de largo 2

HORAS_OTRAS_ASIG

Numrico de largo 2

MONTO_BONO

Numrico de
(obligatorio)

largo

INFORMACIN QUE ALMACENAR


5

Clave primaria de la tabla que contiene el


cdigo del profesor
Total de horas semanales de las asignaturas
con cdigo que finaliza en 1 2 que el
docente dicta.
Total de horas semanales de las otras 3
asignaturas que el docente dicta.
Monto del bono especial calculado para el
docente.

Los docentes que dictan asignaturas con cdigo que finaliza en 1 2 no dictan las otras asignaturas y viceversa.
Si el docente dicta asignaturas cuyo cdigo finaliza con 1 y/o 2 y su total de horas semanales de clases es mayor o
igual a 20 el monto del bono ser el 50% de su sueldo base.
Si el docente dicta asignaturas cuyo cdigo finaliza con 1 y/o 2 y su total de horas semanales de clases es menor a
20 el monto del bono ser el 30% de su sueldo base.
Si el docente no dicta asignaturas cuyo cdigo finaliza con 1 2 y su total de horas semanales de clases es mayor
o igual a 15 el monto del bono ser el 20% de su sueldo base.
Si el docente no dicta asignaturas cuyo cdigo finaliza con 1 2 y su total de horas semanales de clases es menor
a 15 y mayor o igual a 8 el monto del bono ser el 15% de su sueldo base.
Si el docente no dicta asignaturas cuyo cdigo finaliza con 1 2 y su total de horas semanales de clases es menor
a 8 el monto del bono ser el 10% de su sueldo base.

Al finalizar el proceso, el resultado debera ser como se muestra en el ejemplo:


TABLA BONO_PROFESOR

CREATE TABLE BONO_PROFESOR


(cod_profesor NUMBER(5) CONSTRAINT PK_BONO_PROFESOR PRIMARY KEY,
horas_asig_12 NUMBER(2),
horas_otras_asig NUMBER(2),
monto_bono
NUMBER(5) NOT NULL);

Escuela de Informtica y Telecomunicaciones


5.- Para efectos administrativos, la direccin debe contar con informacin estadstica de porcentaje de efectividad de cada
docente en cada una de las asignaturas que dicta. El proceso que Ud. desarrolle debe generar en forma simultnea
informacin resumida por cada profesor e informacin detallada por cada curso en que el docente dict la asignatura de
acuerdo a las siguientes especificaciones:
La informacin resumida por docente debe quedar almacenada en la tabla RESUMEN_ASIG_PROFESOR que
debe tener la siguiente estructura:
NOMBRE DE COLUMNA

TIPO DE DATO

COD_PROFESOR

Numrico de
(obligatorio)
Numrico de
(obligatorio)

COD_ASIGNATURA

TOTAL_ALUMNOS
TOTAL_APROBADOS
TOTAL_REPROBADOS
PORC_APROBADOS

PORC_REPROBADOS

INFORMACIN QUE ALMACENAR

largo

largo

Numrico de largo 3
(obligatorio)
Numrico de largo 3
(obligatorio)
Numrico de largo 3
(obligatorio)
Numrico de largo 4 con
1 decimal (obligatorio)
Numrico de largo 4 con
1 decimal (obligatorio)

Clave primaria de la tabla que contiene el


cdigo del profesor.
Clave primaria de la tabla que contiene el
cdigo de la asignatura que el profesor
dict.
Total de alumnos a los que el profesor
dict la asignatura.
Total de alumnos que aprobaron la
asignatura que dict el profesor.
Total de alumnos que reprobaron la
asignatura que dict el profesor.
Porcentaje (redondeado a un decimal) de
alumnos que aprobaron la asignatura que el
profesor dict.
Porcentaje (redondeado a un decimal) de
alumnos que reprobaron la asignatura que
el profesor dict.

La informacin detallada por cada curso en que el profesor dict la asignatura debe quedar almacenada en la tabla
DETALLE_ASIG_PROFESOR que debe tener la siguiente estructura:
NOMBRE DE COLUMNA

TIPO DE DATO

COD_PROFESOR

Numrico de
(obligatorio)
Numrico de
(obligatorio)

largo

largo

COD_CURSO

Numrico de
(obligatorio)

largo

TOT_ALUMNOS_CURSO

Numrico de largo 3
(obligatorio)
Numrico de largo 3
(obligatorio)
Numrico de largo 3
(obligatorio)
Numrico de largo 4 con
1 decimal (obligatorio)

COD_ASIGNATURA

TOT_APROB_CURSO
TOTAL_REPROB_CURSO
PORC_APROB_CURSO

PORC_REPROB_CURSO

INFORMACIN QUE ALMACENAR

Numrico de largo 4 con1


decimal (obligatorio)

Clave primaria de la tabla que contiene el


cdigo del profesor.
Clave primaria de la tabla que contiene el
cdigo de la asignatura que el profesor
dict.
Clave primaria de la tabla que contiene el
cdigo del curso en que el profesor dict la
asignatura
Total de alumnos del curso.
Total de alumnos del curso que aprobaron
la asignatura que dict el profesor.
Total de alumnos del curso que reprobaron
la asignatura que dict el profesor.
Porcentaje (redondeado a un decimal) de
alumnos que aprobaron la asignatura en el
curso.
Porcentaje (redondeado a un decimal) de
alumnos que reprobaron la asignatura en el
curso.

Al finalizar el proceso, los resultados deberan ser como se muestran en el ejemplo:

Escuela de Informtica y Telecomunicaciones


TABLA RESUMEN_ASIG_PROFESOR

TABLA DETALLE_ASIG_PROFESOR

S-ar putea să vă placă și