Я не понимаю, почему вы используете String#format
здесь.Просто используйте обычную вставку, в которой упоминаются явные столбцы:
String INSERT_SQL = "INSERT INTO AUDIT_TASK (ID, ERROR_MESSAGE, TASK_STEP_TIMESTAMP, OPERATOR) ";
INSERT_SQL += "VALUES (AUDIT_TASK_SEQ.nextval, ?, ?, ?)";
PreparedStatement stmt = con.prepareStatement(INSERT_SQL);
Затем свяжите ваши значения:
stmt.setString(1, audit.getErrorMessage() != null ? audit.getErrorMessage().getValue() : null);
stmt.setTimestamp(2, new Timestamp(cal.getTimeInMillis()), utcCalendarInstance);
stmt.setString(3, audit.getClassName().getValue());
Обратите внимание, что заполнители, в порядке слева направо, относятся к ошибкесообщение, метка времени шага задачи и оператор.Ваш оригинальный код, кажется, связывает параметры не по порядку.Используя оператор вставки, который явно упоминает столбцы, вы можете избежать этой проблемы.
Редактировать:
Мне также не имеет смысла, почему вы беспокоитесьо часовых поясах для вашей временной метки.Просто получите количество миллисекунд с начала эпохи, а затем позвольте базе данных хранить это как UTC:
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
stmt.setTimestamp(2, timestamp);