Área de Tecnologías de la Información y las Comunicaciones Aplicadas
Área de Tecnologías de la Información y las Comunicaciones Aplicadas Universidad de Murcia
Área de Tecnologías de la Información y las Comunicaciones Aplicadas
ATICA arrow DESARROLLO arrow Problemas y Soluciones en Programación arrow Error 0RA-01722 Invalid Number al usar '?' como parametro
23.05.2012
 
 
Error 0RA-01722 Invalid Number al usar '?' como parametro Imprimir E-mail

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.

Última modificación ( 09.11.2009 )
 
Área de Tecnologías de la Información y las Comunicaciones Aplicadas
Volver al incio del documento Volver al inicio del documento
Área de Tecnologías de la Información y las Comunicaciones Aplicadas