Escuela de Informática y TelecomunicacionesGUÍA DE PL/SQL Nº5 USANDO CURSORES EXPLÍCITOS El proceso automático que Ud. construyó para el cálculo 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 información en la Base de Datos y basados en el Modelo que se muestra a continuación, deberá satisfacer los requerimientos de información planteados en cada caso y que son parte del acuerdo contractual entre Ud. y la dirección del colegio: Para crear y poblar las tablas del Modelo efectúe lo siguiente: Conéctese a la base de datos como usuario SYSTEM y ejecute el archivo script_creación_usuario_guía_PLSQL_N°5 que creará el usuario p_plsq5 password practica. Conéctese posteriormente como usuario p_plsq5 y ejecute el archivo script_creación_tablas_guía_PLSQL_N°5 para crear y poblar las tablas del Modelo como se muestra en el ejemplo: TABLA CURSO TABLA ASIGNATURA TABLA ALUMNO Escuela de Informática y Telecomunicaciones TABLA PROFESOR TABLAS PROMEDIO_ASIG_ALUMNO TABLA HORARIO_PROFESOR . Escuela de Informática y Telecomunicaciones . promedio y situación..situacion_asig when 'A' then 'Aprobado' when 'R' then 'Reprobado' end as situacion from promedio_asig_alumno p join alumno a on a.cod_asignatura order by a. .PUT_LINE('===============================================').Escuela de Informática y Telecomunicaciones 1. DBMS_OUTPUT. Debido a esto.appat_alumno || ' ' || a. DBMS_OUTPUT. a. se requiere poder entregar a cada profesor un listado para registrar la asistencia a clases de los alumnos. poder resolver.PUT_LINE('LISTADO SITUACION DE ASIGNATURAS DE LOS ALUMNOS'). BEGIN DBMS_OUTPUT.nombre. Si la situación de la asignatura es A se debe mostrar Aprobado y si es R se debe mostrar Reprobado. los libros de clases se debieron volver a confeccionar pero la imprenta los entregará en una semana más. FOR reg_emp IN cur_emp LOOP DBMS_OUTPUT. DBMS_OUTPUT.Debido a un incendio en la de profesores del colegio.SITUACION ).PUT_LINE( TO_CHAR(ORDEN) || ' ' || reg_emp. Se solicita además que sea guardado en un archivo con el nombre listado_situacion_asig. END LOOP.cod_alumno join asignatura asig on asig.txt.appat_alumno. La información se debe mostrar ordenada por apellido de alumno.PUT_LINE(' '). ORDEN:=ORDEN+1. nombre de la asignatura.nombre as asignatura. case p. El informe requiere el apellido paterno y primer nombre (concatenado) del alumno.La dirección del colegio desea contar en forma urgente con un listado de la situación de cada asignatura de los alumnos. 2.pnombre_alumno. Por esta razón y dada la urgencia de contar esta información. ORDEN NUMBER:=1.ALUMNO || ' ' || reg_emp. asig. requerimiento que le han solicitado a Ud. DBMS_OUTPUT. por ahora sólo es necesario que sea visualizada a través de un bloque PL/SQL Anónimo ya que a través de SQLDeveloper el listado también podrá ser guardado en archivo .txt. END.PUT_LINE('ORDEN ALUMNO ASIGNATURA SITUACION').cod_asignatura = p. nombre del alumno y nombre de la asignatura en forma ascendente y al ejecutar el bloque se debería visualizar en el formato que se muestra en el ejemplo. DECLARE CURSOR cur_emp IS select a..pnombre_alumno as alumno.cod_alumno = p.ASIGNATURA || ' ' || reg_emp. asig.PUT_LINE('============================================================='). La información se requiere en orden alfabético y al ejecutar el bloque PL/SQL el listado debe mostrar la información 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 Informática y Telecomunicaciones El listado debe mostrar el rut y nombre completo del alumno además de los días de la semana de lunes a viernes para registrar la asistencia por cada curso. v_nro_alumno := 0. trim(pnombre_alumno) || ' ' || trim(snombre_alumno) || ' ' || trim(appat_alumno) || ' ' || trim(apmat_alumno) as nombre FROM alumno WHERE cod_curso = p_curso. DBMS_OUTPUT. DBMS_OUTPUT. DBMS_OUTPUT.rut. '999. 40. descripcion FROM curso.999') || '-' || dvrut_alumno as rut.PUT_LINE('Total Alumnos del curso: ' || v_nro_alumno).PUT_LINE('============================================================== ================================').NEW_LINE(). 3..999.La dirección desea que automatice el proceso de cálculo de promedios finales de los alumnos el que además deberá permitir actualizar la información de los alumnos que mantendrán su beca de estudio en los casos que correspondan.3. DBMS_OUTPUT. Se .PUT_LINE('Asistencia '|| reg_curso.Escuela de Informática y Telecomunicaciones DECLARE CURSOR cursos IS SELECT cod_curso. FOR reg_alumno IN alumnos(reg_curso.' ' ) || ' O O O O O').descripcion).nombre. v_nro_alumno NUMBER(2).' ') || rpad(reg_alumno.PUT_LINE('=====================================').20. DBMS_OUTPUT.PUT_LINE('============================================================ ======================================'). CURSOR alumnos(p_curso NUMBER) IS SELECT to_char(numrut_alumno. BEGIN FOR reg_curso IN cursos LOOP DBMS_OUTPUT. END. END LOOP.NEW_LINE(). DBMS_OUTPUT.' ') || rpad(reg_alumno.cod_curso) LOOP v_nro_alumno := v_nro_alumno + 1. DBMS_OUTPUT.PUT_LINE('N° RUT ALUMNO NOMBRE ALUMNO LUNES MARTES MIERCOLES JUEVES VIERNES'). DBMS_OUTPUT. END LOOP.PUT_LINE(rpad(to_char(v_nro_alumno). V_ASIG_2 VARCHAR(01). En ambos casos el alumno pierde la beca de estudio si es que la posee (becado debe quedar NULO). A. V_NRO_ASIG_OTRA_A NUMBER(02). Si el alumno reprobó ambas asignaturas cuyo código finaliza en 1 ó 2 el alumno reprueba el año académico (situación final R) y pierde su beca de estudio si es que la posee (becado debe quedar NULO).8 el alumno reprueba el año académico ( situación final R). Si el alumno reprobó una de las asignaturas cuyo código finaliza en 1 ó 2. . Si el promedio de notas es igual o inferior a 5. Si el alumno aprobó todas las asignaturas.COD_CURSO FROM ALUMNO A. Los valores se redondean a un decimal. V_SITUACION VARCHAR(01). el alumno aprueba el año académico ( situación final A) y mantiene la beca de estudio si es que la posee (becado debe quedar ‘S’). 4. Si el alumno reprobó todas sus asignaturas. obtener la información de acuerdo a las siguientes especificaciones: 1. En ambos casos el alumno pierde la beca de estudio si es que la posee (becado debe quedar NULO).8. V_BECA VARCHAR2(01). Al finalizar la ejecución del bloque. el resultado debería ser el que se muestra en el ejemplo: TABLA PROMEDIO_FINAL_ALUMNO TABLA ALUMNO DECLARE CURSOR ALUMNO IS SELECT A. 2. SITUACION_ASIG FROM PROMEDIO_ASIG_ALUMNO WHERE COD_ALUMNO=P_COD_ALUMNO. Si el alumno aprobó las dos asignaturas cuyo código finaliza en 1 ó 2. además reprobó más de una de las otras asignaturas y el promedio de todas las notas es superior a 5. el alumno aprueba el año académico ( situación final A) y mantiene la beca de estudio si es que la posee (becado debe quedar ‘S’). por cada uno de ellos. pero aprobó todas las otras asignaturas y el promedio de todas las notas es superior a 5. V_NRO_ASIG_A NUMBER(02).0. Si el promedio de notas es igual o inferior a 4. V_SITUACION_CONDICION_6 VARCHAR(01). 3. PROMEDIO_ASIG.0 el alumno reprueba el año académico (situación final R) y pierde la beca de estudio si es que la posee (becado debe quedar NULO) 9. 6. Si el alumno aprobó las dos asignaturas cuyo código finaliza en 1 ó 2.0 el alumno reprueba el año académico ( situación final R).5. Si el promedio de notas es igual o inferior a 5. el alumno reprueba el año académico (situación final R) y pierde su beca de estudio si es que la posee (becado debe quedar NULO). el alumno aprueba el año académico (situación final A). V_PROMEDIO_FINAL NUMBER. V_NRO_ASIG_OTRA NUMBER(02). V_NRO_ASIG_R NUMBER(02). Si el promedio es igual o inferior a 5.8 mantiene la beca de estudio si es que la posee (becado debe quedar ‘S’). Si el alumno reprobó una de las asignaturas cuyo código finaliza en 1 ó 2.Escuela de Informática y Telecomunicaciones deben procesar todos los alumnos.COD_ALUMNO. el alumno aprueba el año académico (situación final A) y si el promedio de notas es mayor a 5. 7. 8.5 el alumno reprueba el año académico (situación final R) y pierde su beca de estudio si es que la posee (becado debe quedar NULO). V_ASIG_1 VARCHAR(01). pero reprobó más de una o todas las otras asignaturas y el promedio de todas las notas es superior a 5. 5. Si el promedio de notas es igual o inferior a 5. CURSOR ASIGNATURA(P_COD_ALUMNO NUMBER) IS SELECT COD_ALUMNO. y de acuerdo a las políticas del colegio.0. el alumno aprueba el año académico ( situación final A). el alumno aprueba el año académico ( situación final A). además aprobó dos de las otras asignaturas y el promedio de todas las notas es superior a 5. Si el alumno reprobó una de las asignaturas cuyo código finaliza en 1 ó 2. En ambos casos el alumno pierde la beca de estudio si es que la posee (becado debe quedar NULO). además reprobó una de las otras asignaturas y el promedio de todas las notas es superior a 4.0. COD_ASIGNATURA.0 el alumno reprueba el año académico ( situación final R). SELECT SITUACION_ASIG INTO V_ASIG_2 FROM PROMEDIO_ASIG_ALUMNO WHERE SUBSTR(COD_ASIGNATURA. END IF. END IF. ELSIF (V_ASIG_2 = 'A' and V_ASIG_1 = 'A') AND V_NRO_ASIG_OTRA_A >= 2 AND V_PROMEDIO_FINAL <= 5.LOOP DE ASIGNATURAS POR ALUMNO END IF. V_BECA := NULL.'2') AND R_ASIG_ALUMNO.PUNTO 7 ELSIF (V_ASIG_2 = 'R' OR V_ASIG_1 = 'R') AND V_NRO_ASIG_OTRA > 1 AND V_PROMEDIO_FINAL > 5. V_NRO_ASIG_OTRA_A := 0.4. ELSIF (V_ASIG_2 = 'R' OR V_ASIG_1 = 'R') AND V_SITUACION_CONDICION_6 = 'R' AND V_PROMEDIO_FINAL <= 4.SITUACION_ASIG = 'R' THEN V_SITUACION_CONDICION_6 := 'R'. IF V_ASIG_2 = 'R' AND V_ASIG_1 = 'R' THEN V_SITUACION := 'R'.SITUACION_ASIG = 'R' THEN V_NRO_ASIG_R := V_NRO_ASIG_R + 1. ELSIF (V_ASIG_2 = 'A' and V_ASIG_1 = 'A') AND V_NRO_ASIG_OTRA > 1 AND V_PROMEDIO_FINAL <= 5. --.4.PUNTO 9 ELSIF (V_ASIG_2 = 'A' and V_ASIG_1 = 'A') AND V_NRO_ASIG_OTRA_A >= 2 AND V_PROMEDIO_FINAL > 5.PUNTO 3 IF V_NRO_ASIG_R <> 0 AND V_NRO_ASIG_A = 0 THEN V_SITUACION := 'R'.PUNTO 3 IF R_ASIG_ALUMNO. --.PUNTO 6 PARTE IF SUBSTR(R_ASIG_ALUMNO. ELSIF (V_ASIG_2 = 'R' OR V_ASIG_1 = 'R') AND V_NRO_ASIG_OTRA > 1 AND V_PROMEDIO_FINAL <= 5. V_BECA := NULL. FOR R_ASIG_ALUMNO IN ASIGNATURA(R_ALUMNO. V_NRO_ASIG_OTRA := 0.PUNTO 4 SELECT SITUACION_ASIG INTO V_ASIG_1 FROM PROMEDIO_ASIG_ALUMNO WHERE SUBSTR(COD_ASIGNATURA.ACTUALIZA EN LAS TABLAS DE PROMEDIO FINAL ALUMNO Y ALUMNO UPDATE PROMEDIO_FINAL_ALUMNO SET PROMEDIO_FINAL= V_PROMEDIO_FINAL.5 THEN V_SITUACION := 'A'. . IF V_PROMEDIO_FINAL > 5.4. ELSIF (V_ASIG_2 = 'R' OR V_ASIG_1 = 'R') AND V_PROMEDIO_FINAL <= 5.PRINCIPAL --. 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. --. V_BECA := 'S'.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. V_BECA := NULL. END LOOP. END IF. ELSIF (V_ASIG_2 = 'R' OR V_ASIG_1 = 'R') AND V_PROMEDIO_FINAL > 5.0 THEN V_SITUACION := 'A'.0 THEN V_SITUACION := 'A'. V_NRO_ASIG_A := 0.0 THEN V_SITUACION := 'A'. ---.0 THEN V_SITUACION := 'R'.COD_ALUMNO. ELSE V_NRO_ASIG_A := V_NRO_ASIG_A + 1. V_BECA := 'S'. -.COD_ASIGNATURA.Escuela de Informática y Telecomunicaciones BEGIN FOR R_ALUMNO IN ALUMNO LOOP --PUNTO 1 Y 2 SELECT ROUND(AVG(PROMEDIO_ASIG).8 THEN V_SITUACION := 'R'.1) = 2 AND COD_ALUMNO = R_ALUMNO.PUNTO 7 PARTE V_NRO_ASIG_OTRA := V_NRO_ASIG_OTRA + 1. V_BECA := NULL. ELSE ---PUNTO 9 V_NRO_ASIG_OTRA_A := V_NRO_ASIG_OTRA_A + 1.COD_ALUMNO. ---.COD_ALUMNO) LOOP --. V_BECA := NULL. ---. --.COD_ALUMNO.1) NOT IN ('1'.0 THEN V_SITUACION := 'R'.8 THEN V_SITUACION := 'A'. END IF.1) = 1 AND COD_ALUMNO = R_ALUMNO. V_BECA := NULL.5 THEN V_SITUACION := 'R'.1) INTO V_PROMEDIO_FINAL FROM PROMEDIO_ASIG_ALUMNO WHERE COD_ALUMNO = R_ALUMNO. V_BECA := NULL.8 THEN V_SITUACION := 'A'. ELSE V_NRO_ASIG_R := 0. --. V_BECA := NULL. ---. V_BECA := 'S'. Para desarrollar este proceso. Total de horas semanales de las otras 3 asignaturas que el docente dicta. UPDATE ALUMNO SET BECADO = V_BECA WHERE COD_ALUMNO = R_ALUMNO. Los docentes que dictan asignaturas con código que finaliza en 1 ó 2 no dictan las otras asignaturas y viceversa.COD_CURSO. IF SQL%NOTFOUND THEN INSERT INTO PROMEDIO_FINAL_ALUMNO VALUES(R_ALUMNO.COD_ALUMNO.COD_CURSO. Si el docente no dicta asignaturas cuyo código 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.COD_ALUMNO AND COD_CURSO = R_ALUMNO. END.Escuela de Informática y Telecomunicaciones SITUACION_FINAL= V_SITUACION WHERE COD_ALUMNO = R_ALUMNO. Por lo tanto. el resultado debería ser como se muestra en el ejemplo: TABLA BONO_PROFESOR CREATE TABLE BONO_PROFESOR (cod_profesor NUMBER(5) CONSTRAINT PK_BONO_PROFESOR PRIMARY KEY. por cada profesor procesado. Si el docente dicta asignaturas cuyo código 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.Como una forma de incentivar el buen trabajo que han desempeñado los profesores durante el año académico. la dirección 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. 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.R_ALUMNO. . Si el docente no dicta asignaturas cuyo código 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.V_PROMEDIO_FINAL.COD_ALUMNO. horas_asig_12 NUMBER(2). 4. las consideraciones son las siguientes: El cálculo 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 Numérico de largo (obligatorio) Numérico de largo 2 HORAS_OTRAS_ASIG Numérico de largo 2 MONTO_BONO Numérico de (obligatorio) largo INFORMACIÓN QUE ALMACENARÁ 5 6 Clave primaria de la tabla que contiene el código del profesor Total de horas semanales de las asignaturas con código que finaliza en 1 ó 2 que el docente dicta. Si el docente dicta asignaturas cuyo código 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.V_SITUACION). COMMIT.. END IF. monto_bono NUMBER(5) NOT NULL). Al finalizar el proceso. Si el docente no dicta asignaturas cuyo código 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. END LOOP. Monto del bono especial calculado para el docente. horas_otras_asig NUMBER(2). Clave primaria de la tabla que contiene el código de la asignatura que el profesor dictó. desarrolle debe generar en forma simultánea información resumida por cada profesor e información detallada por cada curso en que el docente dictó la asignatura de acuerdo a las siguientes especificaciones: La información 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 Numérico de (obligatorio) Numérico de (obligatorio) COD_ASIGNATURA TOTAL_ALUMNOS TOTAL_APROBADOS TOTAL_REPROBADOS PORC_APROBADOS PORC_REPROBADOS INFORMACIÓN QUE ALMACENARÁ largo 5 largo 4 Numérico de largo 3 (obligatorio) Numérico de largo 3 (obligatorio) Numérico de largo 3 (obligatorio) Numérico de largo 4 con 1 decimal (obligatorio) Numérico de largo 4 con 1 decimal (obligatorio) Clave primaria de la tabla que contiene el código del profesor. Total de alumnos del curso que aprobaron la asignatura que dictó el profesor. Porcentaje (redondeado a un decimal) de alumnos que reprobaron la asignatura en el curso.. Porcentaje (redondeado a un decimal) de alumnos que reprobaron la asignatura que el profesor dictó.Escuela de Informática y Telecomunicaciones 5. Clave primaria de la tabla que contiene el código del curso en que el profesor dictó la asignatura Total de alumnos del curso. Total de alumnos que aprobaron la asignatura que dictó el profesor. Total de alumnos a los que el profesor dictó la asignatura. Clave primaria de la tabla que contiene el código de la asignatura que el profesor dictó.Para efectos administrativos. Total de alumnos del curso que reprobaron la asignatura que dictó el profesor. la dirección debe contar con información estadística de porcentaje de efectividad de cada docente en cada una de las asignaturas que dicta. Porcentaje (redondeado a un decimal) de alumnos que aprobaron la asignatura que el profesor dictó. La información 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 Numérico de (obligatorio) Numérico de (obligatorio) largo 5 largo 4 COD_CURSO Numérico de (obligatorio) largo 5 TOT_ALUMNOS_CURSO Numérico de largo 3 (obligatorio) Numérico de largo 3 (obligatorio) Numérico de largo 3 (obligatorio) Numérico de largo 4 con 1 decimal (obligatorio) COD_ASIGNATURA TOT_APROB_CURSO TOTAL_REPROB_CURSO PORC_APROB_CURSO PORC_REPROB_CURSO INFORMACIÓN QUE ALMACENARÁ Numérico de largo 4 con1 decimal (obligatorio) Clave primaria de la tabla que contiene el código del profesor. Al finalizar el proceso. El proceso que Ud. Total de alumnos que reprobaron la asignatura que dictó el profesor. los resultados deberían ser como se muestran en el ejemplo: . Porcentaje (redondeado a un decimal) de alumnos que aprobaron la asignatura en el curso. Escuela de Informática y Telecomunicaciones TABLA RESUMEN_ASIG_PROFESOR TABLA DETALLE_ASIG_PROFESOR .