Feb 1, 2017

Error JAVA con DB2 en prepared statement: DB2 SQL Error: SQLCODE=-418, SQLSTATE= 42610, SQLERRMC=unresolved untyped expression


Hace poco me encontraba desarrollando una solución de JAVA contra un DB2, y me encontré un problema al momento de ejecutar una sentencia tipo prepared statement contra la base de datos. El error era el siguiente:



DB2 SQL Error: SQLCODE=-418, SQLSTATE= 42610, SQLERRMC=unresolved untyped expression

Dicho error se producia en la siguiente linea de código de mi aplicación java:

 PreparedStatement prepStmt = null ;
                                prepStmt = con.prepareStatement(Util.QUERY) ;
                            
                                prepStmt.setString(1, Maquina.CRITICIDAD) ;
                                prepStmt.setString(2, Maquina.IP) ;
                              prepStmt.setQueryTimeout(Integer.valueOf(Util.TIMEOUTQUERY));
                                rs = prepStmt.executeQuery();



La variable estatica Util.QUERY tenia el siguiente valor
(no pongo el valor completo pues la query es muy extensa)
public static String QUERY = "SELECT i2.HOST_NAME,i.inst_name, ? as CRITICIDAD, ? as IP,CURRENT SERVER as DBname,i.SERVICE_LEVEL,i2.OS_NAME,..."

Luego de buscar ampliamente en internet encontré que ese error se produce por que DB2 no es capaz de determinar el tipo de dato que le estamos pasando en el BIND. Por ende arroja ese error que estamos viendo. El Workaround consiste en aplicar un CAST a la consulta de esta manera:

SELECT i2.HOST_NAME,i.inst_name, cast(? as varchar(400)) as CRITICIDAD, cast(? as varchar(400))  as IP,CURRENT SERVER as DBname,...

Luego de eso al ejecutar el prepared Statement esto no dió problemas.
(Esto sólo pasa en DB2. Oracle, sybase y sqlserver el bind como en el primer caso no da ningún tipo de problemas).

No comments:

Post a Comment