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.

 

Anuncios

Query que devuelve todos los días de un determinado mes

Desarrollando algunos reportes, vi la necesidad de contar con un query que devuelva los días de un determinado mes:

SELECT TRUNC (SYSDATE, ‘MON’)+rownum-1 AS dias_del_mes
FROM DUAL
WHERE to_char(SYSDATE,’MON’)=to_char(TRUNC (SYSDATE, ‘MON’)+rownum-1,’MON’)
CONNECT BY LEVEL <= 31;

Devolverá algo asi:

DIAS_DEL_MES
——————–
01/10/2013
02/10/2013
03/10/2013
04/10/2013

Les puede ser útil.