programing

executeUpdate를 사용하는 SELECT 쿼리 동작

codeshow 2023. 8. 10. 21:46
반응형

executeUpdate를 사용하는 SELECT 쿼리 동작

다음을 사용하여 SELECT 쿼리를 실행하는 동안 이상한 동작을 발견했습니다.Statement#executeUpdate()실수로자바독은 분명히 다음과 같이 말하고 있지만,executeUpdate() throws SQLException지정된 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을 사용하고 있습니다.

제가 여기서 뭔가를 놓치고 있는 것일까요, 아니면 운전자가 자신의 행동을 정의할 수 있을까요?

이 행동은 명백히 모순됩니다.Statement.executeUpdateAPI. 흥미로운 것은,java.sql.Driver.jdbcCompliantAPI는 "드라이버는 JDBC 준수 테스트를 통과한 경우에만 여기서 true를 보고할 수 있습니다."라고 말합니다.테스트했습니다.oracle.jdbc.OracleDriver.jdbcCompliant그것은 진실로 돌아옵니다.테스트도 했습니다.com.mysql.jdbc.Driver.jdbcCompliant거짓을 반환합니다.하지만 당신이 묘사한 것과 같은 상황에서, 그것이 던집니다.

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

JDBC 운전자들은 예측할 수 없는 것 같습니다.

사양에 따라Statement.executeUpdate()메서드 반환the row count for SQL Data Manipulation Language (DML).

UPD: 반환된 결과에 대해 가정하려고 시도했습니다(항상 <=>.10) 오라클 문의 구현은 여기에 수많은 호출을 반환하는 것 같습니다.premature batch count(디컴파일된 출처에 따라)OraclePreparedStatement등급).이것은 어떻게든 업데이트 문과 연결되어 있습니다.이 값이 같을 수 있습니다.10결석으로

UPD-2: 이에 따른 성능 확장:The premature batch flush count is summed to the return value of the next executeUpdate() or sendBatch() method.

사용 중인 쿼리는 결과 집합을 생성하지 않지만 행에 분명히 영향을 미칩니다.따라서 SQL 예외가 아니라 영향을 받는 행 수가 카운트됩니다.수수께끼는 왜 그것이 10을 넘지 않는지입니다.Oracle JDBC Driver Implementation Specific일 수 있습니다.

SQL 쿼리는 table_name에서 모든 행을 검색하는 것입니다.그래서, 당신은 사용할 수 있습니다.execute()대신 방법executeUpdate()방법.이후의 방법은 일반적으로 작업이 업데이트 쿼리와 같은 언어를 조작하는 관련 데이터베이스일 때 사용하기 때문입니다.

사용하다

int count = stmt.dll쿼리(탭에서 "SELECT *")LE_NAME";

대신에

int count = stmt.executeUpdate("탭에서 선택 *)LE_NAME";

수를 가져오는사용됩니다.

언급URL : https://stackoverflow.com/questions/13947004/behavior-of-select-query-using-executeupdate

반응형