0

同じ行に複数の呼び出しがあるクエリがあります (以下のコードを参照)

Statement オブジェクトは、JDBCTemplate によって自動的に作成されます。

JDBCTemplate は new JDBCTemplate() としてインスタンス化され、データソースは weblogic サーバー プールから検索されます。

クラス A は org.springframework.jdbc.core.StatementCallback を実装します {

public Object doInStatement(Statement stmt) throws Exception {

String sql = "select * from a where pk = 'test';select * from b where pk = 'test';select * from c where pk = 'test'";

Statement stmt = 

ResultSet rs = stmt.executeQuery(sql);

rs = stmt.getResultSet();
...
rs = stmt.getMoreResults();
...
rs = stmt.getMoreResults();
...

}

IBM の Type 2 ドライバーを使用すると、上記は問題なく動作しました。ドライバーを Oracle の Type 4 JDBC ドライバーに変更する必要があり、それを行ったところ、上記が壊れました。もう機能しません。以下のエラーが表示されます。

[DAO.exec] エラー: java.sql.SQLException: [OWLS][DB2 JDBC ドライバー][DB2]ILLEGAL SYMBOL select * from a where pk ; 有効なシンボルはステートメントの始まりです

Type 4ドライバーが上記をサポートしない理由を知っている人はいますか? ステートメントで使用する必要がある別の区切り文字、それを機能させる別の方法はありますか?

注: このコードは、IBM タイプ 2 JDBC ドライバーでは問題なく動作しましたが、Oracle のタイプ 4 ドライバーに切り替えたときに失敗しました。

アプリケーション サーバーと DB2 データベースとして weblogic を使用します。

4

1 に答える 1

2

1 つの文字列に合成するのではなく、複数のステートメントを個別に実行する必要があります。ほとんどのドライバーは、単一のステートメントの実行のみを許可します。on statement/execute で複数のステートメントを実行できるドライバーはわずかしかありません。

一般に、この動作は JDBC 仕様で明示的に定義されていないため、依存するべきではありません。JDBC仕様の行間を読んだ場合、ステートメント/実行で複数のステートメントを実行するIMHOはまったくサポートされるべきではありませんが、それは議論の余地があります。

ドライバーがこれをサポートしない理由: 一部のデータベース システムは、1 つのステートメント/実行で複数のステートメントの準備、実行、および結果の取得をサポートしていません。したがって、それをサポートするには、JDBCの要件ではありませんが(またはIMHO:JDBCでは許可されていません)、ドライバーは実際にあらゆる種類のフープを介して動作させる必要があります。

1 つのステートメント/実行で 1 つのステートメントのみを実行する必要があるという私の主張を立証するには、次のようにします。

于 2012-09-19T12:15:47.360 に答える