Pregunta

Me preguntaba si había una manera de vincular una ArrayList (o cualquier tipo de Lista, para el caso) a una PreparedStatement que eventualmente se utilizará para acceder a una base de datos Oracle. Encontré:

Alternativas de cláusula PreparedStatement IN?

Y eso parece similar a mi problema, pero esta pregunta es más específica: me gustaría vincular una ArrayList a una PreparedStatement para usarla en Oracle, si es posible, ¿cómo se logra esto?

¿Fue útil?

Solución

No puede vincular una Lista a un solo parámetro en una declaración preparada.

Genere SQL con el marcador de parámetro a para cada elemento de la lista, por ejemplo:

SELECT NAME FROM ITEM WHERE ID IN (?, ?, ?, ?)

Aunque generará una nueva declaración para cada consulta, todavía recomendaría usar un PreparedStatement . Si su lista contiene instancias de String , obtendrá el escape necesario para protegerse de la inyección de SQL.

Pero incluso si es un tipo seguro, como objetos Integer , algunos controladores o middleware pueden almacenar en caché PreparedStatements y devolver una instancia en caché si se solicita el mismo formulario. Por supuesto, algunas pruebas serían necesarias. Si sus listas varían ampliamente en tamaño, tendrá muchas declaraciones diferentes, y una caché mal implementada podría no estar preparada para manejar tantas.

Otros consejos

No puedes vincularlo directamente. Hay una manera de pasar una matriz como parámetro. No tengo idea de qué quieres hacer con él en el lado de la base de datos, por lo que esto puede no ayudarte.

Básicamente, debe crear un tipo de tabla anidada en la base de datos; construya un objeto Java basado en ese tipo, que contenga los datos de su matriz; y pasar eso como parámetro.

Si creó estos objetos en la base de datos:

CREATE OR REPLACE TYPE my_nested_table IS TABLE OF VARCHAR2(20);
CREATE TABLE my_table (a  my_nested_table) NESTED TABLE a STORE AS my_table_a;

Entonces puedes escribir código Java como este:

String[] insertvalues = { "a", "b", "c" };
PreparedStatement p = conn.prepareStatement("INSERT INTO my_table VALUES( ? )");
ARRAY insertParameter = new ARRAY( a_desc, conn, insertvalues );
p.setArray( 1, insertParameter );
p.execute();

Los resultados en Oracle se ven así:

dev> select * from my_table;

A
--------------------------------------------------------------------------------
MY_NESTED_TABLE('a', 'b', 'c')

Bueno, a juzgar por la respuesta a esa, especialmente los comentarios a mi respuesta incorrecta en esa pregunta, no puedes.

Consulte http: // java. sun.com/j2se/1.3/docs/guide/jdbc/getstart/mapping.html#996857

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top