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

KolibriOS, un sistema operativo que ocupa sólo 1.44MB

¿Cuánto ocupa Windows 7 instalado? Alrededor de 10 GB. ¿Una distro común de Linux? Aproximadamente 3 GB. Es menos, pero sigue siendo bastante. Una distribución como Damn Small Linux ocupa unos 50 MB y ya es otra cosa, pero aún así no me satisface del todo. ¡Se necesita un CD para poder utilizarla! Por suerte existe KolibriOS, un sistema operativo que en tiempos en los que hablamos de Teras de información sigue cabiendo en un extinto disco floppy. Así es, el archivo comprimido que descargamos del sitio web sólo ocupa 758,9 KiB, en tanto descomprimido llega al ínfimo tamaño de 1,4 MB. Sigue leyendo

Delphi: MessageDlg en Español

Para tener los MessageDlg en español solo hay que modificar un archivo de Delphi, para la version 6 te vas al siguiente directorio: C:\Archivos de programa\Borland\Delphi6\Source\Vcl y modificas el archivo Consts.pas (varia dependiendo donde lo instalaste)

  SMsgDlgWarning = ‘Warning’;
  SMsgDlgError = ‘Error’;
  SMsgDlgInformation = ‘Information’;
  SMsgDlgConfirm = ‘Confirm’;
  SMsgDlgYes = ‘&Yes’;
  SMsgDlgNo = ‘&No’;
  SMsgDlgOK = ‘OK’;
  SMsgDlgCancel = ‘Cancel’;
  SMsgDlgHelp = ‘&Help’;
  SMsgDlgHelpNone = ‘No help available’;
  SMsgDlgHelpHelp = ‘Help’;
  SMsgDlgAbort = ‘&Abort’;
  SMsgDlgRetry = ‘&Retry’;
  SMsgDlgIgnore = ‘&Ignore’;
  SMsgDlgAll = ‘&All’;
  SMsgDlgNoToAll = ‘N&o to All’;
  SMsgDlgYesToAll = ‘Yes to &All’;

Cambias los valores a español Ej.:

SMsgDlgYes = ‘&Si’;
SMsgDlgCancel = ‘Cancelar’;
….

Luego copias este archivo  Consts.pas a la carpeta C:\Archivos de programa\Borland\Delphi6\Lib y eliminas el compilado Consts.dcu (se creara otro automaticamente)

Y listo, problema solucionado, recuerda hacer un respaldo de los archivos que modificas.