ibatis(Oracle) recuperar un cursor desde un procedure

Estoy intentando hacer un pequeño ejemplo para recuperar con ibatis desde java un cursor de un procedimiento de oracle, pero no consigo que funcione, mi ejemplo es el siguiente:
Mi procedimiento:
create or replace procedure "PRUEBAS".datos_empleados
  (
  par1 IN VARCHAR2,
  cursor1 OUT empleados_pkg.empleados_type
  )
AS
BEGIN
  /* tiene valor par1 */
  IF par1 IS NOT NULL
  THEN
   OPEN cursor1 FOR
    SELECT * FROM EMPLOYEES
    WHERE NAME = par1;
  /* no tiene valor */
  ELSE
     OPEN cursor1 FOR
    SELECT * FROM EMPLOYEES;
  END IF;
END datos_empleados;
Mi sqlMap:
    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">
          {call datos_empleados(?,?)}
Mi forma de llamarlo desde java:
private static final String NAME_SPACE_cursor     = "certificadosCursor.";
private static final String GET_CERTIF_MYLISTCURSOR_NIF     = "getMiListaNifCursor";
            Map map = new HashMap(1);
            System.out.println("getMiListaNifCursor: "+theNombre);
            map.put(MAP_par1,theNombre);
            sqlMapClient.queryForList(NAME_SPACE_cursor+GET_CERTIF_MYLISTCURSOR_NIF,map);    
            emps =  (ArrayList)map.get("cursor1");
            System.out.println("emps: "+emps);
El error que saca es:
constructor CertificacionesBO
Trying to load ibatis configuration file maps/sql-map-config-certificados.xml
Ibatis Configuration loaded
getMiListaNifCursor: angel
SQLException getMiListaNifCursor
capturada SQLException:   
--- The error occurred in maps/certificadosCursor.xml.  
--- The error occurred while applying a parameter map.  
--- Check the certificadosCursor.nifPar.  
--- Check the output parameters (retrieval of output parameters failed).  
--- Cause: java.lang.NullPointerException
com.ibatis.common.jdbc.exception.NestedSQLException:   
--- The error occurred in maps/certificadosCursor.xml.  
--- The error occurred while applying a parameter map.  
--- Check the certificadosCursor.nifPar.  
--- Check the output parameters (retrieval of output parameters failed).  
--- Cause: java.lang.NullPointerException
Caused by: java.lang.NullPointerException
    at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:188)
    at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForList(GeneralStatement.java:123)
    at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:610)
    at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:584)
    at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:101)
    at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForList(SqlMapClientImpl.java:78)
    at com.dao.certificados.CertificadosIbatisDAO.getMiListaNifCursor(CertificadosIbatisDAO.java:80)
    at com.bo.certificados.CertificacionesBO.getMiListaNifCursor(CertificacionesBO.java:48)
    at main.CertificadosCursor.main(CertificadosCursor.java:29)
Caused by: java.lang.NullPointerException
    at com.ibatis.sqlmap.engine.execution.SqlExecutor.retrieveOutputParameters(SqlExecutor.java:354)
    at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQueryProcedure(SqlExecutor.java:301)
    at com.ibatis.sqlmap.engine.mapping.statement.ProcedureStatement.sqlExecuteQuery(ProcedureStatement.java:34)
    at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173)
    ... 8 more
Caused by:
java.lang.NullPointerException
    at com.ibatis.sqlmap.engine.execution.SqlExecutor.retrieveOutputParameters(SqlExecutor.java:354)
    at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQueryProcedure(SqlExecutor.java:301)
    at com.ibatis.sqlmap.engine.mapping.statement.ProcedureStatement.sqlExecuteQuery(ProcedureStatement.java:34)
    at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173)
    at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForList(GeneralStatement.java:123)
    at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:610)
    at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:584)
    at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:101)
    at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForList(SqlMapClientImpl.java:78)
    at com.dao.certificados.CertificadosIbatisDAO.getMiListaNifCursor(CertificadosIbatisDAO.java:80)
    at com.bo.certificados.CertificacionesBO.getMiListaNifCursor(CertificacionesBO.java:48)
    at main.CertificadosCursor.main(CertificadosCursor.java:29)
Caused by:
java.lang.NullPointerException
    at com.ibatis.sqlmap.engine.execution.SqlExecutor.retrieveOutputParameters(SqlExecutor.java:354)
    at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQueryProcedure(SqlExecutor.java:301)
    at com.ibatis.sqlmap.engine.mapping.statement.ProcedureStatement.sqlExecuteQuery(ProcedureStatement.java:34)
    at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173)
    at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForList(GeneralStatement.java:123)
    at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:610)
    at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:584)
    at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:101)
    at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForList(SqlMapClientImpl.java:78)
    at com.dao.certificados.CertificadosIbatisDAO.getMiListaNifCursor(CertificadosIbatisDAO.java:80)
    at com.bo.certificados.CertificacionesBO.getMiListaNifCursor(CertificacionesBO.java:48)
    at...

2 respuestas

1
Respuesta de
Hola,
Por lo que parece, faltan datos en el xml de mapeo y no sabe como mapear las columnas que obtiene el cursor, podrías por favor pegar el contenido del xml que está mapeando y la declaración de empleados_pkg. empleados_type?
Por otra parte estoy observando, que no estas llamando desde java a "PRUEBAS".datos_empleados aunque supongo que es porque tendrás el mapeo de esa manera deberías revisar y evitar llamar a métodos por otro nombre. Una prueba que podrías realizar es hacer la llamada desde JDBC a pelo, para saber si el problema es de la config de iBatis (tiene toda la pinta) o de la llamada/parámetros , aquí te dejo un ejemplo:
String query = "begin ? := "PRUEBAS".datos_empleados(?,?); end;";
CallableStatement stmt = conn.prepareCall(query);
stmt.setString(1, "Nombre");
stmt.registerOutParameter(2, OracleTypes.CURSOR);
stmt.execute();
ResultSet rs = (ResultSet)stmt.getObject(2);
while (rs.next()) {
    //Pos 1 -> ID, Pos2 -> FIRST_NAME, Pos 3 -> LAST_NAME
    System.out.println(rs.getString(2) + "\t" +
        rs.getString(3) + "\t");
}
Si estas usando la tabla EMPLOYEES de HR, la columna NAME no existe, es o bien FIRST_NAME, o LAST_NAME... y si no me pones los xml de iBatis no sé en qué más ayudarte :)
Saludos
Añade un comentario a esta respuesta
0
Respuesta de
teniendo en cuenta que no tengo ni idea de lo que es IBATIS (me informare)
la forma de usar cursores con parametros que yo he usado siempre no tiene la misma sintaxis que el tuyo
    OPEN cursor1 FOR
    SELECT * FROM EMPLOYEES
    WHERE NAME = par1
yo lo pondria así
    OPEN cursor1 FOR
    SELECT * FROM EMPLOYEES
    WHERE NAME = ? using par1
espero te sirva pero vamos... ibatis ibatis....
suerte
Añade un comentario a esta respuesta
Añade tu respuesta
Haz clic para o
Escribe tu mensaje