Ver Mensaje Individual
  #3 (permalink)  
Antiguo 08/02/2013, 15:25
robespierrevelez
 
Fecha de Ingreso: febrero-2013
Mensajes: 2
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Cursor que retorne un estado

Muchas gracias huesos52, resuelve perfecto lo que necesito, por tratarse de fines académicos lo debo realizar con un cursor.

Ya he avanzado solo ahora tengo un error que se me repite la última linea en los resultados con otro estado.
Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION estadoNotasRob()
  2. RETURNS VARCHAR(2000)
  3. AS $$
  4.  
  5. DECLARE
  6.     cursorNotas refcursor;
  7.         --todas las variables
  8.         id_alumno INTEGER;
  9.         nombre VARCHAR;
  10.         apellido VARCHAR;
  11.         descripcion_curso VARCHAR;
  12.         descripcion_asignatura VARCHAR;
  13.         nota_1 INTEGER;
  14.         nota_2 INTEGER;
  15.         nota_3 INTEGER;
  16.         promedio INTEGER;
  17. BEGIN
  18.     OPEN cursorNotas FOR EXECUTE
  19.     ('
  20.     select id_alumno, "nombre", "apellido", "curso", "asignatura", "nota_1", "nota_2", "nota_3", SUM((nota_1 + nota_2 + nota_3)/3) as promedio
  21.     from alumno
  22.     join nota on id_alumno = "ID_alumno"
  23.     join curso on id_curso = "ID_curso"
  24.     join asignatura on id_asignatura = "ID_asignatura"
  25.     group by id_alumno, "curso", "asignatura", "nota_1", "nota_2", "nota_3"
  26.     ');
  27.    
  28.     loop
  29.         fetch cursorNotas INTO id_alumno, nombre, apellido, descripcion_curso, descripcion_asignatura, nota_1, nota_2, nota_3, promedio;
  30.         IF NOT found THEN
  31.         exit;
  32.         END IF;
  33.         IF((promedio)>=9) THEN
  34.             raise notice '%,%,%,%,%,%,%,%,%, Sobresaliente', id_alumno, nombre, apellido, descripcion_curso, descripcion_asignatura, nota_1, nota_2, nota_3, promedio;
  35.         END IF;
  36.         IF((promedio)>=7) THEN
  37.             raise notice '%,%,%,%,%,%,%,%,%, Muy bueno', id_alumno, nombre, apellido, descripcion_curso, descripcion_asignatura, nota_1, nota_2, nota_3, promedio;
  38.         END IF;
  39.         IF((promedio)<=6) THEN
  40.             raise notice '%,%,%,%,%,%,%,%,%, Regular', id_alumno, nombre, apellido, descripcion_curso, descripcion_asignatura, nota_1, nota_2, nota_3, promedio;
  41.         END IF;
  42.        
  43.     END loop;
  44.     close cursorNotas;
  45.     RETURN 'Regular';
  46. END;
  47. $$
  48. LANGUAGE 'plpgsql'

Este es el resultado.

select estadoNotasRob()

NOTICE: 1,jose,castro,(1,primero),(1,fisica),8,9,5,7, Muy bueno
NOTICE: 2,carla,ponce,(3,tercero),(2,matematicas),7,7,4,6, Regular
NOTICE: 3,julio,arias,(5,quinto),(1,fisica),8,8,8,8, Muy bueno
NOTICE: 4,roberto,martinez,(3,tercero),(5,literatura),6,6, 7,6, Regular
NOTICE: 5,emilio,garcia,(4,cuarto),(3,calculo),10,10,10,10 , Sobresaliente
NOTICE: 5,emilio,garcia,(4,cuarto),(3,calculo),10,10,10,10 , Muy bueno