|
1- Descripción del error.
Cuando el alumno pasa de la pantalla de elección de asignaturas de Libre Configuración, la aplicación intenta obtener las condiciones de matrícula para el presente curso. En una de las consultas para procesar dichas condiciones se produce el error.
Mensaje de error:
Error automatricula.liquidacion.ManagerAlumno.condicionesMatricula. SQLException:47091440 MSG: ORA-01722: invalid number
[FATAL] ManagerAlumno: ERROR:java.sql.SQLException: ORA- 01722: invalid number
Código Java causante del error:
if (rs.getInt(1)!=0){rs.close();
qry.close();
if(alumno.getMatricula().getExpediente().getTitulacion().isIc()) {
qry = getQuery(conn,"CreditosHonorIC");
qry.setString(1,alumno.getMatricula().getExpediente().
getTitulacion().isPorAsignaturas()?"A":"C");
qry.setString(2, alumno.getSivaId());
qry.setInt(3, (Integer.parseInt(alumno.getMatricula().getAnyo())-1));
qry.setString(4,alumno.getMatricula().getExpediente().getTitulacion().getCodTitu1());
qry.setString(5,alumno.getMatricula().getExpediente().getTitulacion().getCodPlan1());
qry.setString(6,alumno.getMatricula().getExpediente().getTitulacion().getCodTitu2());
qry.setString(7,alumno.getMatricula().getExpediente().getTitulacion().getCodPlan2());
}
else {
qry = getQuery(conn,"CreditosHonor");
qry.setString(1,alumno.getMatricula().getExpediente().
getTitulacion().isPorAsignaturas()?"A":"C");
qry.setString(2, alumno.getSivaId());
qry.setInt(3, (Integer.parseInt(alumno.getMatricula().getAnyo())-1));
qry.setString(4, alumno.getMatricula().getExpediente().
getTitulacion().getCodigo());
qry.setString(5, alumno.getMatricula().getExpediente().
getTitulacion().getPlan().getCodigo());
}
rs=qry.executeQuery(); <--//AL LANZAR LA EJECUCIÓN PRODUCE EL ERROR
if (rs.next()){alumno.getMatricula().getLiquidacion().setCreditosHonor(rs.getFloat(1));
alumno.getMatricula().getLiquidacion().
setNumHonor(String.valueOf(rs.getFloat(1)));
}
rs.close();
qry.close();
Código SQL causante del error:
<QUERY NAME="CreditosHonor">
<SQL>
Select TO_NUMBER(NVL(DECODE(?,'C',SUM(A.NUM_CRED_TEO + A.NUM_CRED_PRA),'A',SUM(DECODE(A.DURACION,'C','0,5','1'))),0))From PLANES.ASIGNATURAS A, V_MAT_ACTAS_NOTAS V Where V.SIVA_ID = ? And V.CURSO_ACA = ? And V.COD_TITU = ? And V.COD_PLAN = ? And V.NOTA = '4' And A.COD_ASI = V.COD_ASI
</SQL>
</QUERY>
Los "?" denotan parámetros que se le pasan a la consulta, el error se produce al realizar el DECODE, siendo el párametro del decode una "A" o una "C".
Al lanzar la consulta desde el TOAD ésta se ejecuta sin ningún tipo de problema. También se ha probado desde la aplicación Automatrícula en local desde el equipo del desarrollador y no se produce el error. El error sólo se produce cuando se invoca desde los servidores de desarrollo, FLORA y desde el de explotación NONA.
Se ha verificado que los parámetros que recibe la consulta son los correctos y del tipo adecuado. Por lo que no se encuentra motivo coherente por el que se produce el error.
2- Solución del error.
Se pensó en un principio que si se evitaba la llamada directa a la consulta SQL en el código java se solventaría dicho error, por lo que se creó una función de base de datos que ejecutaría dicha sentencia. Una vez creada la función se comprobó que el error se seguía produciendo.
La solución final consistió en quitar de la consulta el parámetro del decode y realizar la lógica con una sentencia "If Then Else", quedando la función de la siguiente forma.
CREATE OR REPLACE FUNCTION F_CRED_HONOR (p_siva_id INVARCHAR2,p_cod_titu IN VARCHAR2, p_cod_plan IN VARCHAR2, p_curso_aca IN VARCHAR2,p_tipo IN VARCHAR2 DEFAULT NULL) RETURN NUMBER IS
n_total NUMBER;
vc_tipo VARCHAR2(1);
BEGIN
If p_tipo Is Null Then
vc_tipo :='C';
Else
vc_tipo := p_tipo;
End If;
If vc_tipo ='C' Then
Select TO_NUMBER(NVL(SUM(A.NUM_CRED_TEO + A.NUM_CRED_PRA),0))
Into n_total
From PLANES.ASIGNATURAS A, V_MAT_ACTAS_NOTAS V
Where V.SIVA_ID = p_siva_id
And V.CURSO_ACA = p_curso_aca
And V.COD_TITU = p_cod_titu
And V.COD_PLAN = p_cod_plan
And V.NOTA ='4'
And A.COD_ASI = V.COD_ASI;
Else
Select TO_NUMBER(NVL(SUM(DECODE(A.DURACION,'C','0,5','1')),0))
Into n_total
From PLANES.ASIGNATURAS A, V_MAT_ACTAS_NOTAS V
Where V.SIVA_ID = p_siva_id
And V.CURSO_ACA = p_curso_aca
And V.COD_TITU = p_cod_titu
And V.COD_PLAN = p_cod_plan
And V.NOTA ='4'
And A.COD_ASI = V.COD_ASI;
End If;
Return n_total;
END;
De esta forma se ha conseguido que en los servidores FLORA y NONA, funcionase el código java que producía el error. Esta solución se ha adoptado tanto para los alumnos de titulaciones normales como para las de itinerario de conjunto.
|