Llamar Stored Procedure en Java con tipo de datos SYS_REFCURSOR como salida

publicado por: Anonymous

Estoy realizando una aplicación de consola en JAVA, donde requiero ejecutar un Stored Procedure hecho en Oracle, dicho Stored Procedure tiene tres variables de entrada que son de tipo de dato String y dos de salida las cuales una es de tipo String y la ultima es de tipo SYS_REFCURSOR. El problema que tengo que al momento indicar los tipos de datos que me va a devolver este Stored Procedure, en Java no me reconoce el tipo de dato SYS_REFCURSOR.

Este el un ejemmplo de mi codigo en JAVA:

Connection connection = null;
CallableStatement callableStatement = null;


try {
    connection = ConnectionConfiguration.getConecction();
    callableStatement = connection.prepareCall("{CALL sp_jobsMonitor_UpdateCurrentSt(?,?,?,?,?)}");
    callableStatement.setString(1, job.getJobName());
    callableStatement.setString(2, job.getExecutionStatus());
    callableStatement.setString(3, job.getExceptionID());
    callableStatement.registerOutParameter(4, Types.VARCHAR);
    callableStatement.registerOutParameter(5, Types.xxxx);

    callableStatement.executeUpdate();

    job.setExceptionMessage(callableStatement.getString(4));

} catch (ClassNotFoundException e) {
    e.printStackTrace();
} catch (SQLException e) {
    e.printStackTrace();
}finally {
    if (callableStatement != null) {
        try {
            callableStatement.close();
        } catch (SQLException e) {
            return e.getMessage();
        }
    }

    if (connection != null) {
        try {
            connection.close();
        } catch (SQLException e) {
            return e.getMessage();
        }
    }
}
return "ok";

En la linea callableStatement.registerOutParameter(5, Types.xxxx); es donde requiro indicar ese tipo de dato SYS_REFCURSOR.

Ya he intendo indicando el tipo de dato Types.OTHER e incluso Types.VARCHAR no se que estoy haciendo mal u omitiendo.

Saludos

NOTA: Los tipos de datos que uso se basan en los tipos de Datos de Oracle.

solución

Ese tipo de cursores no están soportados por JDBC, solo se soporta vía Oracle. Para resolver esto, debes utilizar el tipo de dato de salida de Oracle:

import oracle.jdbc.*;

//...
callableStatement.registerOutParameter(5, OracleTypes.CURSOR);

Fuente: https://oracle-base.com/articles/misc/using-ref-cursors-to-return-recordsets

Respondido por: user227

Leave a Reply

Your email address will not be published. Required fields are marked *