Autor Tema: Error Stored Procedure  (Leído 418 veces)

0 Usuarios y 1 Visitante están viendo este tema.

faraya

  • General Guarani
  • *
  • Mensajes: 161
    • Ver Perfil
    • Email
  • Institución: Universidad Nacional de la Patagonia Austral
  • Nombre y apellido: Fernando Daniel Araya
  • Sistema: SIU-GUARANI
  • Teléfono laboral: 0297-4854888 int 114
Error Stored Procedure
« on: Octubre 02, 2013, 07:38:04 pm »
Estimados, estoy modificando el stored procedure sp842_fichalupers. El mismo me genera una lista con los alumnos que tienen aprobada un cierto porcentaje de la carrera. Este porcentaje lo calcula, a grandes rasgos dividiendo la cantidad de materias aprobadas/la cantidad de materias del plan de estudio.
Lo que yo necesito modificar, es que no tome todas las materias aprobadas (normales, optativas de la ficha del alumno), sino que me tome las normales mas las genéricas como cantidad de materias aprobadas. Por esta razón agregue al mismo otro procedimiento que me cuenta las materias genéricas que tiene aprobadas un alumno..y se las suma a la cantidad de materias normales aprobadas..
Lo que pasa que cuando lo ejecuto, me dice que el stored procedure que agregue devuelve mas de una fila, necesito saber si alguien sabe como corregirlo para que no me salga este error.
estos son los storeds..
drop PROCEDURE "dba".sp842_fichalupers;
CREATE PROCEDURE "dba".sp842_fichalupers(  pUnidadAcademica LIKE sga_personas.unidad_academica,
                                                                         pcarrera Like sga_carreras.carrera,
                                                                         pplan like sga_planes.plan ,
                                                                         pporcentaje integer)
       RETURNING varchar(5), varchar(15),varchar(5), varchar(30), varchar(30), date,varchar(100),integer, integer, integer;
-- Descripcion del Return:
--varchar(5),   -- vc_UA,
--varchar(15),  -- vc_Legajo,
--varchar(5),   -- vc_Carrera,
--varchar(30),  -- vc_Nombres,
--varchar(30),  -- vc_Apellido,
--date,               --vc_FechaIngreso
--varchar(100), -- vc_CarreraNombre,
--integer ,  pporcentaje




-- Definición de Variables.
DEFINE vi_retorno          SMALLINT;
DEFINE vc_Legajo           LIKE sga_alumnos.legajo;
DEFINE vc_nombres          LIKE sga_personas.nombres;
DEFINE vc_apellido         LIKE sga_personas.apellido;

DEFINE vc_FechaIngreso        LIKE dba.sga_alumnos.fecha_ingreso;
DEFINE vc_CarreraNombre    LIKE sga_carreras.nombre;

DEFINE  vc_CantMaterias integer;
DEFINE  vc_CantMatplan integer;
DEFINE  vc_mat_equiv integer;
DEFINE  vc_mat_gener integer;
--DEFINE  vc_cant_gener integer;

BEGIN
   
   -- inicializaciones.
   LET vc_Legajo           = NULL;
   LET vc_nombres          = NULL;
   LET vc_apellido         = NULL;
   LET vc_FechaIngreso     = NULL;
   LET vc_CarreraNombre    = NULL;
   LET vc_CantMaterias     = 0;
   LET vc_mat_equiv        = NULL;
LET vc_mat_gener        = 0;
--LET vc_cant_gener        = 0;


--Obtiene la cantidad de materias aprobadas
   FOREACH
     SELECT dba.sga_alumnos.legajo,
        dba.sga_alumnos.fecha_ingreso ,
        dba.sga_carreras.nombre,
        dba.sga_personas.apellido,
        dba.sga_personas.nombres,
        dba.sga_planes.cnt_materias,
        count(dba.sga_alumnos.legajo)
        INTO vc_legajo,
                  vc_FechaIngreso,
                  vc_CarreraNombre,
              vc_apellido,
                  vc_nombres,
                   vc_CantMatplan,
                   vc_CantMaterias
           from dba.vw_hist_academica,dba.sga_alumnos,dba.sga_planes,sga_carreras,sga_personas
          where vw_hist_academica.resultado='A'
         and vw_hist_academica.carrera =pcarrera
         and vw_hist_academica.legajo=sga_alumnos.legajo
         and vw_hist_academica.carrera=sga_alumnos.carrera
         and sga_planes.plan=pplan
         and sga_alumnos.carrera=pcarrera
         and sga_alumnos.carrera=sga_carreras.carrera
         and sga_alumnos.nro_inscripcion=sga_personas.nro_inscripcion
         group by
        dba.sga_alumnos.legajo,
        dba.sga_alumnos.fecha_ingreso,
        dba.sga_carreras.nombre,
        dba.sga_personas.apellido,
        dba.sga_personas.nombres,
        dba.sga_planes.cnt_materias

        --Obtiene las materias pasadas por equivalencia
        select count (materia)
        into vc_mat_equiv
        from sga_equiv_relacion
        where sga_equiv_relacion.legajo=vc_legajo           
        and sga_equiv_relacion.carrera=pcarrera;

        --Al total de materias aprobadas se le resta las pasadas por equivalencia
        LET vc_CantMaterias=vc_CantMaterias - vc_mat_equiv;

--****Codigo Personalizado******************************************************************************************************************************
--FOREACH
EXECUTE PROCEDURE "dba".sp842_GenericasPlan(  pUnidadAcademica, pcarrera, pplan, vc_legajo) INTO vc_mat_gener;
--END FOREACH;
 
--************************************************************************************************************************************************************   
          --LET vc_cant_gener= CONVERT(integer, vc_mat_gener);
          LET vc_CantMaterias=vc_CantMaterias + vc_mat_gener;     

        --Si cumple con el porcentaje retorna los datos del alumno
         IF ((vc_CantMaterias/vc_CantMatPlan)*100)  > pporcentaje  then
                RETURN pUnidadAcademica, vc_Legajo, pcarrera,vc_Nombres, vc_Apellido,vc_FechaIngreso , vc_CarreraNombre, vc_CantMaterias, vc_CantMatplan, pporcentaje   WITH RESUME;
         END IF;

  END FOREACH;

END;

END PROCEDURE
;

EXECUTE PROCEDURE "dba".sp842_fichalupers(  'UACO', '048', '048P3', 70);

--DROP TABLE tmp_materia_porcen;

drop PROCEDURE "dba".sp842_GenericasPlan;
CREATE PROCEDURE "dba".sp842_GenericasPlan(  pUnidadAcademica LIKE sga_personas.unidad_academica,
                                                                         pcarrera Like sga_carreras.carrera,
                                                                         pplan like sga_planes.plan,
                                                                         plegajo like sga_alumnos.legajo)
       RETURNING integer;
-- Descripcion del Return:
--decimal(6,2) ,  vdPorcentaje




-- Definición de Variables.
DEFINE vcVersion LIKE sga_versiones_plan.version;
DEFINE vcTitulo LIKE sga_atrib_mat_orie.titulo;
DEFINE vcOrientacion LIKE sga_atrib_mat_orie.orientacion;
DEFINE vcMateria LIKE sga_atrib_mat_orie.materia;
DEFINE vdPorcentaje integer;
DEFINE vcResultGene char(1);
DEFINE vc_mat_gener integer;--decimal(6,2);



BEGIN
   
   -- inicializaciones.
   LET vc_mat_gener        = 0;

CREATE TEMP TABLE tmp_materia_porcen (
   unidad_academica varchar(5),
   carrera varchar(5),
   legajo varchar(15),
   plan varchar(5),
   version varchar(5),
   titulo varchar(5),
   orientacion varchar(5),
   materia varchar(5)) WITH NO LOG;

INSERT INTO tmp_materia_porcen (unidad_academica, carrera, plan, version, titulo, orientacion, materia)
SELECT vmp.unidad_academica, vmp.carrera, vmp.plan, vmp.version, vmp.titulo, vmp.orientacion, vmp.materia
      FROM vw_materias_plan AS vmp, sga_atrib_mat_plan AS samp, sga_planes p
      WHERE vmp.unidad_academica = pUnidadAcademica
         AND vmp.carrera = pcarrera
         AND vmp.plan = pplan
         AND vmp.relacion = 'D'
         AND vmp.unidad_academica = samp.unidad_academica
         AND vmp.carrera = samp.carrera
         AND vmp.plan = samp.plan
         AND vmp.version = samp.version
         AND vmp.materia = samp.materia
         AND obligatoria='S'
                                                AND vmp.unidad_academica = p.unidad_academica
         AND vmp.carrera = p.carrera
         AND vmp.plan = p.plan
         AND vmp.version = p.version_actual;
                                                                     
 
   FOREACH WITH HOLD SELECT titulo, orientacion, materia
      INTO vcTitulo, vcOrientacion, vcMateria
      FROM tmp_materia_porcen

      LET vdPorcentaje = 0;

      IF (SELECT tipo_materia
         FROM sga_materias
         WHERE unidad_academica = pUnidadAcademica
            AND materia = vcMateria) = 'G' THEN

         -- si la materia es generica busco el porcentaje de aprobacion
         EXECUTE PROCEDURE sp_resultGenePorc(pUnidadAcademica, pcarrera, plegajo, vcTitulo, vcOrientacion,vcMateria) INTO vcResultGene, vdPorcentaje;
                                                LET vc_mat_gener = vdPorcentaje + vc_mat_gener;
      
      END IF;
      
   END FOREACH; --materia
                RETURN   vc_mat_gener WITH RESUME;
DROP TABLE tmp_materia_porcen;
END;

END PROCEDURE;

EXECUTE PROCEDURE "dba".sp842_GenericasPlan(  'UACO', '048', '048P3', '1-17185411/99');