13

Statement#executeUpdate()誤って SELECT クエリを実行しているときに、奇妙な動作に遭遇しました。executeUpdate() throws SQLExceptionJavadocは、指定された SQL ステートメントが ResultSet オブジェクトを生成するかどうかを明確に述べています。しかし、私が実行しているときSELECT * from TABLE_NAME、例外は発生しません。代わりに、いいえと同じ戻り値を取得しています。いいえの場合、選択された行の数。が 10 以下です。いいえの場合。が 10 より大きい場合、戻り値は常に 10 です。

Connection conn;
Statement stmt;
try {
    conn = getConnection();
    stmt = conn.createStatement();
    int count = stmt.executeUpdate("SELECT * from TABLE_NAME");
    log.info("row count: " + count);
} catch (SQLException e) {
    log.error(e);
    // handle exception
} finally {
    DbUtils.closeQuietly(stmt);
    DbUtils.closeQuietly(conn);
}

Oracle 10gを使用しています。

ここで何かが足りないのですか、それともドライバーが独自の動作を定義するのはドライバー次第ですか?

4

6 に答える 6

4

この動作は明らかに API と矛盾しStatement.executeUpdateます。興味深いことに、 java.sql.Driver.jdbcCompliantAPI は、「ドライバーは、JDBC コンプライアンス テストに合格した場合にのみ、ここで true を報告する可能性があります」と述べています。テストoracle.jdbc.OracleDriver.jdbcCompliantしました-trueを返します。私もテストcom.mysql.jdbc.Driver.jdbcCompliantしました-falseを返します。しかし、あなたが説明したのと同じ状況で、それはスローされます

Exception in thread "main" java.sql.SQLException: Can not issue SELECT via executeUpdate().

JDBC ドライバーは予測不能のようです。

于 2012-12-19T07:23:09.187 に答える
3

Statement.executeUpdate()返品方法は仕様によりますthe row count for SQL Data Manipulation Language (DML)

UPD : 返された結果 (常に <= ) について仮定しようとしました10premature batch countOracle ステートメントの実装は、(逆コンパイルされたソースOraclePreparedStatementクラスによると)呼び出された多数のステートメントをここに返すようです。これは何らかの形で更新ステートメントにリンクされています。10この値はデフォルトで等しい場合があります。

UPD-2:これによると: Performance Extensions :The premature batch flush count is summed to the return value of the next executeUpdate() or sendBatch() method.

于 2012-12-19T07:04:43.103 に答える
2

使用しているクエリは ResultSet を生成しませんが、明らかに行に影響します。そのため、SQLException は取得せず、影響を受ける行数を取得します。謎は、なぜ10を超えないのかということです。それはOracle JDBC Driver Implementation Specificです。

于 2012-12-19T07:01:36.707 に答える
1

SQLクエリは、table_nameからすべての行を取得することです。execute()したがって、メソッドの代わりにメソッドを使用できますexecuteUpdate()。後者の方法は、タスクが更新クエリのようなデータベース操作言語に関連している場合に一般的に使用されるためです。

于 2012-12-19T07:05:41.663 に答える
1

使用する

int count = stmt.executeQuery("SELECT * from TABLE_NAME") ;

それ以外の

int count = stmt.executeUpdate("SELECT * from TABLE_NAME") ;

合計番号を取得するため。行の

于 2012-12-28T14:09:53.723 に答える
0

一般的なケース (選択または更新) の場合:

    Statement st = conn.createStatement();
    st.execute(sql);
于 2013-08-13T11:01:12.083 に答える