}
public void performAction(Connection connection, OperationObserver observer)
throws SQLException, Exception {
LOBBatchQueryBuilder queryBuilder;
if (query instanceof InsertBatchQuery) {
queryBuilder = new LOBInsertBatchQueryBuilder(getAdapter());
}
else if (query instanceof UpdateBatchQuery) {
queryBuilder = new LOBUpdateBatchQueryBuilder(getAdapter());
}
else {
throw new CayenneException(
"Unsupported batch type for special LOB processing: " + query);
}
queryBuilder.setTrimFunction(OracleAdapter.TRIM_FUNCTION);
queryBuilder.setNewBlobFunction(OracleAdapter.NEW_BLOB_FUNCTION);
queryBuilder.setNewClobFunction(OracleAdapter.NEW_CLOB_FUNCTION);
// no batching is done, queries are translated
// for each batch set, since prepared statements
// may be different depending on whether LOBs are NULL or not..
LOBBatchQueryWrapper selectQuery = new LOBBatchQueryWrapper(query);
List<DbAttribute> qualifierAttributes = selectQuery
.getDbAttributesForLOBSelectQualifier();
boolean isLoggable = QueryLogger.isLoggable();
query.reset();
while (selectQuery.next()) {
int updated = 0;
String updateStr = queryBuilder.createSqlString(query);
// 1. run row update
QueryLogger.logQuery(updateStr, Collections.EMPTY_LIST);
PreparedStatement statement = connection.prepareStatement(updateStr);
try {
if (isLoggable) {
List bindings = queryBuilder.getValuesForLOBUpdateParameters(query);
QueryLogger.logQueryParameters(
"bind",
null,
bindings,
query instanceof InsertBatchQuery);
}
queryBuilder.bindParameters(statement, query);
updated = statement.executeUpdate();
QueryLogger.logUpdateCount(updated);
}
finally {
try {