Question

Je me demandais s’il existait un moyen de lier un ArrayList (ou tout autre type de liste) à un état PreparedStatement qui sera éventuellement utilisé pour accéder à une base de données Oracle. J'ai trouvé:

Alternatives à la clause PreparedStatement IN?

Et cela semble similaire à mon problème, mais cette question est plus précise: je voudrais lier un ArrayList à un PreparedStatement à utiliser dans Oracle, si cela est possible, comment cela est-il accompli?

Était-ce utile?

La solution

Vous ne pouvez pas lier une liste à un seul paramètre dans une instruction préparée.

Générez du code SQL avec le marqueur de paramètre a pour chaque élément de la liste, par exemple:

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

Même si vous allez générer une nouvelle instruction pour chaque requête, je vous recommande néanmoins d'utiliser un PreparedStatement . Si votre liste contient des instances String , vous obtiendrez l'échappement nécessaire pour se protéger de l'injection SQL.

Mais même s'il s'agit d'un type sûr, comme les objets Integer , certains pilotes ou middlewares peuvent mettre en cache PreparedStatements et renvoyer une instance mise en cache si le même formulaire est demandé. Bien sûr, des tests seraient nécessaires. Si la taille de vos listes varie considérablement, vous aurez plusieurs instructions différentes et un cache mal implémenté risque de ne pas être préparé pour en gérer autant.

Autres conseils

Vous ne pouvez pas le lier directement. Il existe un moyen de passer un tableau en tant que paramètre. Je n'ai aucune idée de ce que vous voulez en faire du côté de la base de données, donc cela ne vous aidera peut-être pas.

Fondamentalement, vous devez créer un type de table imbriqué dans la base de données; construisez un objet Java basé sur ce type, contenant les données de votre tableau; et passer cela comme paramètre.

Si vous avez créé ces objets dans la base de données:

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;

Ensuite, vous pouvez écrire du code Java comme ceci:

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

Les résultats dans Oracle ressemblent à ceci:

dev> select * from my_table;

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

Eh bien, à en juger par la réponse à cette question, en particulier les commentaires de ma mauvaise réponse à cette question, vous ne pouvez pas.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top