Documente Academic
Documente Profesional
Documente Cultură
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:
TABLA ASIGNATURA
TABLA ALUMNO
TABLA PROFESOR
TABLAS PROMEDIO_ASIG_ALUMNO
TABLA HORARIO_PROFESOR
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.
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
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);
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
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.
TIPO DE DATO
COD_PROFESOR
Numrico de
(obligatorio)
Numrico de
(obligatorio)
COD_ASIGNATURA
TOTAL_ALUMNOS
TOTAL_APROBADOS
TOTAL_REPROBADOS
PORC_APROBADOS
PORC_REPROBADOS
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)
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
TABLA DETALLE_ASIG_PROFESOR