Invocar procedimiento PLSQL desde JAVA con parámetros de tipo ARRAY de entrada y salida

Comparto un tip que les puede ayudar al momento de trabajar con JAVA y ORACLE.

En ORACLE tenemos esto:

CREATE OR REPLACE TYPE ESQUEMA.OBJ_OBJETO AS OBJECT (
ID VARCHAR2(10),
TYPE_CODE VARCHAR2(10),
MESSAGE VARCHAR2(4000)
);

CREATE OR REPLACE TYPE ESQUEMA.TYP_TABLA AS TABLE OF PROCS.OBJ_OBJETO;

PROCEDURE PROCEDIMIENTO(
pi_data IN ESQUEMA.TYP_TABLA,
po_data OUT ESQUEMA.TYP_TABLA)

Partimos con la premisa que tenemos una conexión jdbc que se llama conection, A continuación el código de ejemplo:

OracleConnection oconn = null;
oconn = conection.unwrap(oracle.jdbc.OracleConnection.class);   //obtenemos la una conexion oracle, para manejar los objetos, de otra manera no sera posible continuar
ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor(“ESQUEMA.TYP_TABLA”, oconn);
StructDescriptor structDescriptor = StructDescriptor.createDescriptor(“ESQUEMA.OBJ_OBJETO”, oconn);

Object[] iStructs = new Object[2];  //este sera la base del ARRAY
Object[] iAttributes = new Object[3]; // este es un registro del ARRAY

iAttributes[0] = “123”;
iAttributes[1] = “CODE”;
iAttributes[2] = “TEXTO”;
iStructs[0] = new STRUCT(structDescriptor,oconn,iAttributes);

iAttributes[0] = “456”;
iAttributes[1] = “COLE”;
iAttributes[2] = “NUEVO TEXTO”;
iStructs[1] = new STRUCT(structDescriptor,oconn,iAttributes);

ARRAY datosIn = new ARRAY(descriptor,oconn,iStructs);

CallableStatement cs = oconn.prepareCall(“{call ESQUEMA.PAQUETE.PROCEDIMIENTO(?, ?)}”);
cs.setArray(1, datosIn);  //parametro de entrada
cs.registerOutParameter(2, Types.ARRAY, “ESQUEMA.TYP_TABLA”); //parametro de salida
cs.execute();

Object[] data = cs.getObject(2)!=null? (Object[]) ((Array) cs.getObject(2)).getArray() :null;
// si nos devuelve datos, mostramos en consola
if(data!=null){
System.out.println(“quantity resp: “+data.length);

for(Object tmp : data) {
Struct row = (Struct) tmp;
Object[] values = row.getAttributes();
System.out.println( “ID = ” + values[0]);
System.out.println( “TYPE_CODE = ” + values[1]);
System.out.println( “MESSAGE = ” + values[2]);
System.out.println(“—“);
}

}
cs.close();
conection.close();
oconn.close();

Espero les ayude. Saludos.