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

PL/SQL: Intervalo de tiempo

Andaba buscando por todas partes en PL/SQL la manera mas pratica de mostrar el tiempo transcurrido entre dos fechas, y encontre esta que me parece muy practica.

Este script nos muestra como obtener la diferencia entre dos fechas mostrada en dias, horas, minutos y segundos:

DECLARE
v_h1 date;
v_h2 date;
v_aux number;
a INTERVAL DAY TO SECOND;

BEGIN

v_h1 := sysdate;
v_h2 := sysdate + 1.255;

v_aux := v_h2 – v_h1;
a := NUMTODSINTERVAL (v_aux,’Day’);

DBMS_OUTPUT.PUT_LINE(‘Tiempo de intervalo: ‘ || a);

END;

El resultado mostrado es el siguiente:

Tiempo de intervalo: +01 06:07:12.000000

Un dia, 6 horas, 7 minutos y 12 segundos