プリペアドステートメントで配列を処理するにはどうすればよいですか?つまり、クエリを実行したいのですが、取得するパラメータの1つは、クエリで使用する文字列の配列です(配列内にフィールドがある行を選択しないでください)。
3 に答える
これはおそらく今は役に立たないでしょうが、JDBC4は2003バージョンのSQLで定義されている配列型をサポートすることを読みました。
一部のJDBCドライバーには、(JDBC 4より前に)プリペアドステートメントで配列型パラメーターをサポートする独自の拡張機能がすでに含まれている場合があります。これについては、APIに問い合わせる必要があります。これは、SQLで配列のような型を使用および操作する必要があることを意味します。
回避策の1つは、一時テーブルを使用することです。これらは、そのようなソリューションのメタステップです。
- トランザクションを開始します(これは、トランザクションメソッド(EJBまたはSpring)内にいる場合は自動的に行われます)。
- プリペアドステートメントでJDBCバッチ挿入を使用して、一時テーブルにarrary要素を作成して入力します(一時テーブルにはトランザクションスコープが必要です。これもデータベース独自のものですが、少なくともOracleでサポートされています)。
- 配列値を使用するための一時テーブルへの結合を含む目的のSQLを構築します(明示的な内部または外部のJOIN、または暗黙的な結合、たとえばEXISTSなどを使用できます)。
- トランザクションをコミット(またはアプリケーション例外の場合はロールバック)します(これにより一時テーブルが破棄されます。同時トランザクションでは、同じ名前の一時テーブルに対して競合が発生しないようにする必要があります)。
例:IN式は一時テーブルへのJOINに置き換えられます。
これは、使用されているRDBMSに大きく依存します。多くの場合、このような機能は、ベンダーのjdbcドライバー拡張機能を使用して実現できます。
私が見つけた2つのバリアントは(Oracleの場合): http: //blogs.itemis.de/kloss/2009/03/05/arrays-preparedstatements-jdbc-and-oracle/
http://www.angelfire.com/home/jasonvogel/java_jdbc_arrays.html
それがあなたを助けるかどうか見てみてください。