Procedimientos Almacenados Oracle desde Java

Ya se que nunca posteo, pero hoy decidí romper la rutina :-D

Como mandarllamar procedimientos almacenados desde Java, un poco más específico utilizando el EntityManager...
Tengo un DataSource configurado en el AppServer

con el EntityManager se pueden ejecutar directamente procedimientos, pero no pude obtener los parámetros de salida, es por eso que lo hice de otra manera... primero se hace referencia al DataSource para obtener la conexion

    @Resource(name = "jdbc/myDS")
    private DataSource dataSource;

luego para realizar la ejecucion del procedimiento se hace lo siguiente

        Connection conn=null; //se declara una variable Connection
        try{
            conn = this.dataSource.getConnection();// se obtiene la conexion del DataSource antes declarado
            CallableStatement cs = null;
            cs = conn.prepareCall("call procedure(?,?,?,?,?)");

           //Se settean las variables de entrada del procedimiento
            cs.setInt("IN_ID",837);
            SimpleDateFormat sdf= new SimpleDateFormat("dd/MM/yyyy");
            Date date= sdf.parse("22/06/2004");
            cs.setTimestamp("IN_FECHA",new Timestamp(date.getTime()));
            cs.setDouble("IN_VALOR",1.8);

            //Se registran las variables de salida del procedimiento
            cs.registerOutParameter("OUT_ED",Types.INTEGER);
            cs.registerOutParameter("OUT_CVE",Types.INTEGER);
            cs.execute();//Ejecución del procedimiento

            // aca de obtienen las variables de salida del procedimiento
            System.out.println(cs.getInt("OUT_ED"));
            System.out.println(cs.getInt("OUT_CVE"));
            conn.close();
        }catch(SQLException e){e.printStackTrace();}catch(Exception er){
       
            er.printStackTrace();
        }

Así es como lo implementé, también se puede hacer mediente indices es decir

cs = conn.prepareCall("call procedure(?,?,?,?,?)");
cs.setInt(1,837);
SimpleDateFormat sdf= new SimpleDateFormat("dd/MM/yyyy");
Date date= sdf.parse("22/06/2004");
cs.setTimestamp("IN_FECHA",new Timestamp(date.getTime()));
cs.setDouble("IN_VALOR",1.8);

si alguien tiene alguna mejor manera de hacerlo, compártalo, espero y le sirva a alguién....

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

finally

La conexión deberías cerrarla en el finally, no dentro del try. Si ocurre una excepción en tu código así como está, se va a quedar esa conexión abierta.

Connection conn = null;//
try {
  //blabla todo tu codigo aqui excepto el close()
} catch (SQLException ex) {
  //manejar la excepcion
} finally {
  if (conn != null) {
    try {
        conn.close();
    } catch (SQLException ex) {
        //ni modo no se pudo cerrar
    }
}

De esa forma la conexión siempre se cierra, haya excepción o no.

Imagen de Gustavo

Cierto

Tienes razón, aunque esa parte nisiquiera la iba a poner, la coloqué sólo por referencia, aunque si es totalmente necesario, un descuido de mi parte, gracias por la corrección.

Saludos