Foros del Web » Programación para mayores de 30 ;) » Java »

Cómo pasar un array como parámetro a un procedimiento almacenado

Estas en el tema de Cómo pasar un array como parámetro a un procedimiento almacenado en el foro de Java en Foros del Web. Hola, Necesito insertar en una tabla de base de datos 5000 registros. Lo que estoy haciendo es llamar desde un servlet a un procedimento almacenado ...
  #1 (permalink)  
Antiguo 20/02/2006, 06:20
 
Fecha de Ingreso: febrero-2006
Mensajes: 20
Antigüedad: 18 años, 2 meses
Puntos: 1
Cómo pasar un array como parámetro a un procedimiento almacenado

Hola,

Necesito insertar en una tabla de base de datos 5000 registros. Lo que estoy haciendo es llamar desde un servlet a un procedimento almacenado en una bd oracle, pasándole a este procedimiento los valores que debe insertar en la tabla.

Servlet:

for (int fila = 0; fila < 5000; fila++) {
CallableStatement cs = conn.prepareCall("{ call proInsertaPrueba ( ?,?,?,? ) }");
cs.setInt(1, 999);
cs.setInt(2, fila + 1);
cs.setString(3, “Valor”);
cs.setDouble(4, 4759.66);

ResultSet rsP = cs.executeQuery();
rsP.close();
cs.close();
} // end for


Procedimiento almacenado:

create procedure proInsertaPrueba (numCodigo IN NUMBER, numFila IN NUMBER, varValor IN VARCHAR2, numCantidad IN NUMBER)
IS
BEGIN
INSERT INTO PRUEBA_INSERT (Codigo, Fila, Valor, Cantidad)
VALUES (numCodigo, numFila , varValor, numCantidad);
COMMIT;
END;
/
El problema está en que tengo que llamar al procedimiento 5000 veces, ya que este procedimiento realiza una inserción en una tabla.

¿ Existe alguna manera de pasar la procedimiento almacenado un array ?

De tal forma que sólo haya que llamar al procedimiento un vez pasándole como parámetro un array de 5000 registros y este procedimiento almacenado se encargará de leer el array e realizar la inserciones en la tabla. Además de esta forma sólo hay un acceso a la base de datos.

Gracias de antemano.
  #2 (permalink)  
Antiguo 20/02/2006, 06:52
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Hola,

La opcion es en este caso usar parametros de oracle del tipo "tabla PLSQL" que se declaran en PLSQL como
Código:
Type MiTabla is TABLE OF VARCHAR2(255) INDEX BY BINARY_INTEGER;
La cuestión es que para pasarselos puedes hacer dos cosas, intentar pasarselo utilizando un tipo especifico de Oracle, no lo he probado y no se como ira, o crear una sentencia SQL de llamada al procedimiento donde declares la variable de ese tipo, asignarle los valores uno a uno y luego ejecutar la llamada al procedimiento. En ese caso la sentencia SQL se haría enoooooorme, así que para tu caso no se si merece la pena.

Así que quizá tu mejor opcion sea mirar la documentacion del driver Oracle para encontrar algo no estandar JDBC y poder pasarle directamente el array. No es seguro que lo haya, pero por mirar...
  #3 (permalink)  
Antiguo 20/02/2006, 06:55
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Hola de nuevo,

En la version 9i, parece que existia algo pero solo para el driver OCI:
http://www.stanford.edu/dept/itss/do...nc.htm#1017512
  #4 (permalink)  
Antiguo 21/02/2006, 06:49
 
Fecha de Ingreso: febrero-2006
Mensajes: 20
Antigüedad: 18 años, 2 meses
Puntos: 1
¿Que problema habría en utilizar el OCI?

De todas formas he metido el setPlsqlIndexTable y me da error en la compilación ya que no encuentra este método. He puesto:

import oracle.jdbc.OracleTypes;
import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.oci.*;

y aún así me da error.

¿en qué jar está este método setPlsqlIndexTable ?


Gracias por responderme y darme la idea del OCI.
  #5 (permalink)  
Antiguo 21/02/2006, 07:49
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Si no tienes el driver OCI* quiza no te salga el método ya que "parece" que solo está para esa versión. El problema de usar OCI es que es un driver JDBC de nivel 2, es decir: necesita librerias nativas instaladas en el S.O. para funcionar. En este caso, el servidor donde tengas tu aplicacion que usa el driver necesita tener SQL*Net instalado.

Lo cual a veces es un problema.

PD: *Para aclarar, decir que el driver OCI se descarga aparte, no son unicamente unas clases extra en el Driver Thin de Oracle.
  #6 (permalink)  
Antiguo 08/07/2011, 15:53
 
Fecha de Ingreso: julio-2011
Ubicación: MEDELLIN - ANTIOQUIA
Mensajes: 1
Antigüedad: 12 años, 9 meses
Puntos: 0
Mensaje Respuesta: Cómo pasar un array como parámetro a un procedimiento almacenado

Saludos, no si si ya hayas solucinado tu problema, ni si mi solucion funcione,
hasta donde lei tienes ese problema y trabajas con base de datos oracle
yo tuve ese mismo inconveniente, pero yo trabajo con BD Sql server de cualquier modo aki va

-- ESTA SOLUCION ES PARA SQL SERVER NO PROBADA EN ORACLE!!!!
para insertar x registros en una tabla puedes utilizar:

Código:
INSERT INTO 'nombre_de_tabla' ('col1','col2','col3','coln...') SELECT 'valor1','valor2','valor3','valorn...' FROM 'otra_tabla' WHERE 'cualuier condicion'
en este punto realmente lo que trato de decir es que puedes hacer un insert masivo,
es un insert normal, pero en luvar de escribir INSERT INTO VALUES reemplazamos values por cualquier consulta o sub consulta que necesitemos
este codigo en especifico inserta los registros resultantes de :
Código:
SELECT 'valor1','valor2','valor3','valorn...' FROM 'otra_tabla' WHERE 'cualuier condicion'
en
Código:
'nombre_de_tabla'

Ahora podrias aplicar este insert dentro de tu procedimiento almaceado...
Espero Haberte Ayudado,si no a solucionar por lo menos a encontrar una solucion, Saludos...

REYNERTH RASLOW
the show must go on keep playing the role
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 10:54.