lunes, 13 de mayo de 2019

Pasar un array de java a Nested

Buenos días, tardes, noches.

Este día les traigo la creacion de un nuevo desarrollo el cual se trata de el paso de informacion de java a Oracle, usando del lado de Oracle lo que se conoce como Nested Table del cual encuentran mas informacion aquí.

Dejando a un lado la estructura de la tabla en Oracle, nos vamos directo al código en el lado de Java.


He creado la siguiente estructura, una clase Pojo, una clase Dao y por ultimo una clase Library, empezando por el Pojo tenemos lo siguiente.

public class ObjetoPojo{

    // creamos la clase que servira de estructura para los valores que se envian y reciben

    // con su respectivo constructor

    private int clave = 0;

    private String valor = "N/A";

    public ObjetoPOJO(int clave, String valor){

        this.clave = clave;

        this.valor = valor;

    }

    public int getClave() {

        return clave;

    }



    public void setClave(int clave) {

        this.clave = clave;

    }



    public String getValor() {

        return valor;

    }



    public void setValor(String valor) {

        this.valor = valor;

    }

 

}

pasando a la clase Dao quedaria de la siguiente manera

 
public class conexionDao {
    // el metodo pasaNestedPrueba: cuenta con un parametro del tipo lista< ObjetoPOJO>

    public ListpasaNestedPrueba(List item) {
        /*
        * se crea una varible para el retorno
         */
        List adds = new ArrayList<>();
        try {
            /*
             * se crean los descriptores para la estructura y el arreglo que llevara la informacion a la tabla en base de datos y al final se prepara la llamada al procedimiento almacenado
             */ 
            conecta();
            StructDescriptor desc2 = StructDescriptor.createDescriptor("TABLA_STRUCT", conexion);
            ArrayDescriptor des = ArrayDescriptor.createDescriptor("TABLA_DATA", conexion);
            CallableStatement st = conexion.prepareCall("call schema.package.procedure( ? , ? )");

            /*
             * se necesita de un arreglo de objetos, en este caso lo creamos a la longitud de la lista que recibimos, al igual que el arreglo que posteriormente se pasara a la base
             */ 
            Object[] itemAtributes = new Object[item.size()];
            STRUCT itemObject = null;
            STRUCT[] idsArray = new STRUCT[item.size()];

            /*
             * recorremos la lista que pasa como parametro y llenamos instantáneamente el arreglo de tipo Objeto , para asignarlo a la estructura y agregarlo al arreglo final.
             */
            for (int i = 0; i < item.size(); i++) {
                itemAtributes = new Object[]{
                    item.get(i).getClave(),
                    item.get(i).getValor()
                };
                itemObject = new STRUCT(desc2, conexion, itemAtributes);
                idsArray[i] = itemObject;
            }

            /*
             * creamos un ARRAY del tipo oracle.sql.ARRAY pasandole el arreglo de objetos estructurados
             */
            ARRAY array_to_pass = new ARRAY(des, conexion, idsArray);

            /*
             * seteamos los parametros de la llamada
             */
            st.setArray(1, array_to_pass);
            st.registerOutParameter(2, OracleTypes.CURSOR);
            st.executeQuery();
            /*
             *     despues de haber ejecutado el comando en oracle recorremos el set de resultados y asignamos los valores otenidos en la variable retorno
             */
            ResultSet rs = (ResultSet) st.getObject(2);

            while (rs.next()) {
                ObjetoPOJO _consulta = new ObjetoPOJO();

                _consulta.setClave(rs.getInt("clave"));
                _consulta.setValor(rs.getString("valor"));

                adds.add(_consulta);
            }
            desconecta();

        } catch (SQLException e) {
            System.err.println("Exception in Method DAO: " + e);
        } finally {
            desconecta();
        }
        return adds;
    }
}


ahora vamos a la clase library

 
public class ConexionNestedLibrary {

    /*
     * este metodo asigna los valores a una lista que sera enviada al Dao
     * para su guardado en la base,
     * llenando 100 elementos y posteriormente recibidos 
     */
    public void estableseMatriz() {
        List lista = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            ObjetoPOJO _item = new ObjetoPOJO(i + 1, "Dato: " + i + " : con valor " + (i + 1));
            lista.add(_item);
        }
        ConexionNestedDAO cnd = new ConexionNestedDAO();

        List recibido = cnd.pasaNestedPrueba(lista);
        for (int i = 0; i < recibido.size(); i++) {
            System.out.println("Clavedel producto: " + recibido.get(i).getClave()
                    + " con valor: " + recibido.get(i).getValor());
        }
    }
}



Una vez finalizado el ejercicio no me queda mas que esperar sus comentarios, sean buenos o malos, aquí los espero... hasta pronto y buen día.


No hay comentarios:

Publicar un comentario