Domanda

Mi chiedevo se ci fosse un modo per associare un ArrayList (o qualsiasi tipo di Elenco, per quella materia) a un PreparedStatement che alla fine verrà utilizzato per accedere a un database Oracle. Ho trovato:

PreparedStatement IN clausole alternative?

E questo sembra simile al mio problema, ma questa domanda è più specifica: mi piacerebbe associare una ArrayList a una PreparedStatement da utilizzare in Oracle, se possibile, come viene realizzato?

È stato utile?

Soluzione

Non puoi associare un Elenco a un singolo parametro in un'istruzione preparata.

Genera SQL con l'indicatore di parametro a per ciascun elemento nell'elenco, ad esempio:

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

Anche se genererai una nuova istruzione per ogni query, ti consiglio comunque di utilizzare un PreparedStatement . Se il tuo elenco contiene istanze String , otterrai l'escaping necessario per proteggere dall'iniezione SQL.

Ma anche se è un tipo sicuro, come gli oggetti Integer , alcuni driver o middleware possono memorizzare nella cache PreparedStatements e restituire un'istanza memorizzata nella cache se viene richiesto lo stesso modulo. Naturalmente, alcuni test sarebbero necessari. Se le tue liste hanno dimensioni molto diverse, avrai molte dichiarazioni diverse e una cache mal implementata potrebbe non essere pronta a gestirne tante.

Altri suggerimenti

Non puoi vincolarlo direttamente. C'è un modo per passare un array come parametro. Non ho idea di cosa tu voglia fare con esso dal lato del database, quindi questo potrebbe non aiutarti.

Fondamentalmente, è necessario creare un tipo di tabella nidificata nel database; costruire un oggetto Java basato su quel tipo, contenente i dati dall'array; e passalo come parametro.

Se hai creato questi oggetti nel database:

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;

Quindi puoi scrivere il codice Java in questo modo:

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();

I risultati in Oracle sembrano così:

dev> select * from my_table;

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

Bene, a giudicare dalla risposta a quella, in particolare dai commenti alla mia risposta sbagliata in quella domanda, non puoi.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top