2008-11-19 12 views
5

Me preguntaba si había una manera de vincular una ArrayList (o cualquier tipo de lista, para el caso) a un estado preparado que eventualmente se utilizará para acceder a una base de datos Oracle. He encontrado:¿Cómo puedo vincular una ArrayList a un PreparedStatement en Oracle?

PreparedStatement IN clause alternatives?

y que parece similar a mi problema, pero esta pregunta es más específica: Me gustaría enlazar un ArrayList a un PreparedStatement para ser utilizado en Oracle, si es posible, cómo es esto logrado?

+0

¿En que capacidad? ¿A qué se parece tu extracto (con marcadores de posición)? Dudo que haya una solución general para esto, ya que 1) la longitud de la Lista variará y 2) la cantidad de marcadores de posición en su declaración probablemente no lo hará. Además, no todas las listas están ordenadas. –

+0

Matt, todos los objetos que implementan java.util.List proporcionan una operación get (int) que recupera el objeto en el índice especificado. También proporciona un iterador. Ambos no son opcionales: el orden puede ser impar, pero existe un orden. Entonces, todas las implementaciones de java.util.List * están * ordenadas ... – MetroidFan2002

+0

... y, en Java, la lista generalmente se refiere al contrato de la interfaz java.util.List. – MetroidFan2002

Respuesta

5

No se puede obligar a una lista de un solo parámetro en una declaración preparada.

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

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

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

Pero incluso si se trata de 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 memoria caché mal implementada podría no estar preparada para manejar tantas.

+0

Eso es lo que tenía miedo, pero parece que tienes que generar una "cadena de interrogación" y anexarla a tu declaración SQL general. Oh bien. – MetroidFan2002

3

No se puede enlazar directamente. Hay una manera de pasar una matriz como un parámetro. No tengo idea de qué quiere hacer con el lado de la base de datos, así que puede que esto no lo ayude.

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

Si ha creado 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 usted puede escribir código Java como esto:

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 aspecto:

dev> select * from my_table; 

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