我有兩列在我的表「res_allocation」,一個「ResName」和其他「PID」,「ResName」將有多個值爲單個「PID」。如何根據一個值更新表的多個行?
是否有單個查詢更新基於PID的多行中的「ResName」值?
「ResName」的新值會動態顯示,即其用戶輸入。我使用SQL數據庫。
我有兩列在我的表「res_allocation」,一個「ResName」和其他「PID」,「ResName」將有多個值爲單個「PID」。如何根據一個值更新表的多個行?
是否有單個查詢更新基於PID的多行中的「ResName」值?
「ResName」的新值會動態顯示,即其用戶輸入。我使用SQL數據庫。
這已經改編自我已有的代碼......可能有一兩個錯誤,但癥結將起作用(它在我的代碼中起作用)。理想情況下,像這樣的事情應該使用像Hiberante這樣的ORM工具來完成。
基本上你設置了批量更新,然後運行statement.executeBatch()來做實際的更新。您將返回一個帶結果的int []數組。您根據預定義的常量列表來檢查這些常量,看看發生了什麼。這比單獨執行每個更新要快得多。此外,您可以在一個事務中合併所有更新,使回滾更容易。
public void updateResNames(List<ResAllocationDTO> list) {
String sql = "UPDATE res_allocation SET ResName = ? WHERE PID = ?";
PreparedStatement statement = null;
try {
statement = connection.prepareStatement(sql);
for (ResAllocationDTO dto : list) {
statement.setString(1, dto.getResName());
statement.setString(2, dto.getPID());
statement.addBatch();
}
int[] result = statement.executeBatch();
for (int i = 0; i < result.length; i++) {
if (result[i] == PreparedStatement.EXECUTE_FAILED) {
throw new SQLException(String.format("Entry %d failed to execute in the batch insert with a return code of %d.", i, result[i]));
}
}
commit();
} catch (SQLException e) {
logger.error(LoggerCodes.DATABASE_ERROR, e);
rollback();
throw new RuntimeException(e);
} finally {
close(statement);
}
}
提交(),關閉()和rollback()看起來是這樣的:
public void close(PreparedStatement statement) {
try {
if (statement != null && !statement.isClosed())
statement.close();
} catch (SQLException e) {
logger.debug(LoggerCodes.TRACE, "Warning! PreparedStatement could not be closed.");
}
}
protected void commit() {
try {
if ((connection != null) && !connection.getAutoCommit()) {
connection.commit();
}
} catch (SQLException e) {
logger.debug(LoggerCodes.TRACE, "Warning! ResultSet could not be closed after commit.");
}
}
protected void rollback() {
try {
if ((connection != null) && !connection.getAutoCommit()) {
connection.rollback();
}
} catch (SQLException e) {
logger.debug(LoggerCodes.TRACE, "Warning! ResultSet could not be closed after rollback.");
}
}
我希望這可以幫助你!祝你好運,快樂的編碼!
ResName將具有不同的值 – Vinod