Ошибка при вставке значения объекта символа Java в столбец Oracle CHAR(1)

Я использую Spring jdbcTemplate.update(String sql, Object[] args) для выполнения подготовленного оператора вставки в базу данных Oracle. Один из объектов — это объект Character, содержащий значение «Y», а целевой столбец имеет тип CHAR(1), но я получаю

java.sql.SQLException: Invalid column type

исключение.

Я отлаживал это вдоль и поперек, и нет никаких сомнений в том, что именно этот конкретный объект вызывает проблему. Вставка выполняется, как и ожидалось, когда этот объект символов опущен.

Я также могу вывести значения sql и Object[], скопировать sql в sql developer, заменить заполнители значений (?'s) фактическими значениями объектов, и вставка будет работать нормально.

SQL (запутанный, чтобы защитить виновных):

INSERT INTO SCHEMA.TABLE(NUMBER_COLUMN,VARCHAR_COLUMN,DATE_COLUMN,CHAR_COLUMN) VALUES (?,?,?,?);

Значения объекта:

values[0] = [123]
values[1] = [Some String]
values[2] = [2012-04-19]
values[3] = [Y]

Комбинация запускается вручную в sql-разработчике, и это отлично работает:

INSERT INTO SCHEMA.TABLE(NUMBER_COLUMN,VARCHAR_COLUMN,DATE_COLUMN,CHAR_COLUMN) VALUES (123,'Some String','19-Apr-2012','Y');

Сам подготовленный оператор sql генерируется динамически на основе ненулевых объектов переменных экземпляра, содержащихся в объекте передачи данных (мы хотим, чтобы база данных обрабатывала генерацию значений по умолчанию), поэтому я не могу принять никаких ответов, предполагающих, что я просто переделываю sql или процедуру вставки.

Кто-нибудь когда-либо сталкивался с этим и может объяснить мне, что происходит и как это исправить? Разочаровывающе странно, что я не могу вставить объект Character в поле CHAR(1). Любая помощь приветствуется.

С уважением, давний луркер Первый постер


person SpreckFoo    schedule 24.05.2012    source источник


Ответы (1)


Не существует PreparedStatement.setXxx(), который принимает символьное значение, и в документах Oracle указано, что все типы символов JDBC сопоставляются со строками Java. Также см. http://docs.oracle.com/javase/1.3/docs/guide/jdbc/getstart/mapping.html#1039196, который не включает сопоставление Java char или Character с типом JDBC.

Вам нужно будет преобразовать значение в строку.

person Jim Garrison    schedule 24.05.2012