Frage

Ich habe mich gefragt, ob es eine Möglichkeit war eine Arraylist zu binden (oder irgendeine Art von Liste, was das betrifft) zu einem PreparedStatement, die schließlich verwendet werden, werden eine Oracle-Datenbank zuzugreifen. Ich fand:

PreparedStatement IN-Klausel Alternativen?

Und das scheint ähnlich zu meiner Frage, aber diese Frage ist spezifischer:? Ich mag eine Arraylist zu einem PreparedStatement binden, in Oracle verwendet werden sollte, wenn es möglich ist, wie wird dies erreicht,

War es hilfreich?

Lösung

Sie können keine Liste auf einen einzelnen Parameter in einer vorbereiteten Erklärung binden.

SQL mit der einem Parameter-Markierung generiert für jedes Element in der Liste, zum Beispiel:

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

Auch wenn Sie eine neue Anweisung für jede Abfrage generieren werde, würde ich noch empfehlen eine PreparedStatement verwenden. Wenn Ihre Liste String Instanzen enthält, werden Sie die notwendige Flucht erhalten von SQL-Injection zu schützen.

Aber selbst wenn es ist eine sichere Art, wie Integer Objekte, einige Treiber oder Middleware kann PreparedStatements zwischenzuspeichern, und gibt eine zwischengespeicherte Instanz, wenn die gleiche Form angefordert wird. Natürlich wären einige Tests erforderlich. Wenn Sie Ihre Listen weit in der Größe variieren, werden Sie viele verschiedene Aussagen haben, und ein schlecht implementiertes Cache möglicherweise nicht so viele zu handhaben, hergestellt werden.

Andere Tipps

Sie können es nicht direkt binden. Es gibt eine Möglichkeit, ein Array als Parameter zu übergeben. Ich habe keine Ahnung, was Sie mit ihm auf der Seite Datenbank tun wollen, so kann dies Ihnen nicht helfen.

Im Grunde müssen Sie einen verschachtelten Tabellentyp in der Datenbank erstellen; ein Java-Objekt baut auf dieser Art basieren, die Daten von Ihrem Array enthält; und übergeben, daß als Parameter.

Wenn Sie diese Objekte in der Datenbank angelegt:

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;

Dann können Sie Java-Code wie folgt schreiben:

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

Die Ergebnisse in Oracle wie folgt aussehen:

dev> select * from my_table;

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

Nun, die Beurteilung durch die Antwort auf diese ein, vor allem die Kommentare meiner falsche Antwort in dieser Frage können Sie nicht.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top