ArrayListをOracleのPreparedStatementにバインドするにはどうすればよいですか?
-
08-07-2019 - |
質問
ArrayList(またはその種類のリスト)をPreparedStatementにバインドして、最終的にOracleデータベースへのアクセスに使用する方法があるかどうか疑問に思っていました。見つけた:
それは私の問題に似ていますが、この質問はより具体的です:Oracleで使用されるPreparedStatementにArrayListをバインドしたいのですが、可能であれば、これはどのように達成されますか?
解決
準備済みステートメントの単一のパラメーターにリストをバインドすることはできません。
リスト内の各要素のパラメーターマーカーを使用してSQLを生成します。例:
SELECT NAME FROM ITEM WHERE ID IN (?, ?, ?, ?)
クエリごとに新しいステートメントを生成しますが、 PreparedStatement
を使用することをお勧めします。リストに String
インスタンスが含まれている場合、SQLインジェクションから保護するために必要なエスケープを取得できます。
ただし、 Integer
オブジェクトのような安全なタイプであっても、一部のドライバーまたはミドルウェアは PreparedStatements
をキャッシュし、同じフォームが要求された場合、キャッシュされたインスタンスを返します。もちろん、いくつかのテストが必要になります。リストのサイズが大幅に異なる場合は、さまざまなステートメントが存在し、実装が不十分なキャッシュではそれほど多くのキャッシュを処理する準備ができていない可能性があります。
他のヒント
直接バインドすることはできません。パラメータとして配列を渡す方法があります。データベース側で何をしたいかわからないので、これは役に立たないかもしれません。
基本的に、データベースにネストしたテーブルタイプを作成する必要があります。その型に基づいて、配列からのデータを含むJavaオブジェクトを構築します。それをパラメータとして渡します。
これらのオブジェクトをデータベースに作成した場合:
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;
次に、次のようなJavaコードを記述できます。
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();
Oracleの結果は次のようになります。
dev> select * from my_table;
A
--------------------------------------------------------------------------------
MY_NESTED_TABLE('a', 'b', 'c')
まあ、その答え、特にその質問の間違った答えへのコメントから判断すると、できません。
http:// javaを参照してください。 sun.com/j2se/1.3/docs/guide/jdbc/getstart/mapping.html#996857