guia 5 cursores.docx

13
Escuela de Informática y Telecomunicaciones GUÍ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

Transcript of guia 5 cursores.docx

PRACTICA

Escuela de Informtica y Telecomunicaciones

GUA DE PL/SQL N5USANDO 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

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 situacionfrom promedio_asig_alumno pjoin alumno a on a.cod_alumno = p.cod_alumnojoin asignatura asig on asig.cod_asignatura = p.cod_asignaturaorder 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. 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.

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 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);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 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 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 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 = 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