Вставить запись с PreparedStatementCreator (должен работать в Oracle и PostgreSQL) - PullRequest
0 голосов
/ 05 ноября 2011

Я пытаюсь использовать оператор Spring Jdbc Prepared для вставки записей в таблицу.Этот код должен работать на Postgres и Oracle.Мне нужно прочитать вставленный ключ записи после вставки.

Я нашел нижеприведенный код в главе JDBC документации Spring, где написано "это работает с Oracle".
См. Ссылку здесь (раздел 12.2.8).

Хорошо работает на Postgres, вставляет запись, и я могу прочитать вставленный ключ записи с помощью keyHolder.Однако в Oracle происходит сбой с сообщением об ошибке ниже ...

[junit] STDOUT [ОШИБКА] [2011.11.04 01:26:04] ..... - Тест ...... не удалось.[junit] Сообщение: PreparedStatementCallback;SQL [];ORA-01400: невозможно вставить NULL в ("SOME_USER". "SOME_TABLE". "ID") [junit];вложенное исключение: java.sql.SQLIntegrityConstraintViolationException: ORA-01400: невозможно вставить NULL в ("SOME_USER". "SOME_TABLE". "ID")

Вот код ...

        KeyHolder keyHolder = new GeneratedKeyHolder();
    jdbcTemplate.update(new PreparedStatementCreator()
    {
        public PreparedStatement createPreparedStatement(Connection connection) throws SQLException
        {
            PreparedStatement ps = connection.prepareStatement("insert into some_table(xxx_name,xxx_date), new String[] { "id" });
            ps.setString(1, "some name");
            ps.setDate(2, "some date");
            return ps;
        }
    }, keyHolder);

Примечание: я использую ojdbc6.jar (Oracle jdbc jar), dbcp jar commons

Вот здесь applicationContext dataSource bean

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${db.driver}" />
    <property name="url" value="${db.url}" />
    <property name="username" value="${db.username}" />
    <property name="password" value="${db.password}" />
</bean>

У меня есть последовательности, присутствующие на Postgresи Oracle, для таблицы some_table_id_seq.Я должен заставить этот код работать для Postgres (работает на машинах разработчиков) и Oracle (работает на производстве).Любая помощь / идеи приветствуются.Спасибо.

1 Ответ

1 голос
/ 05 ноября 2011

Вы не показали нам определение таблицы (DDL) для Postgres и Oracle, но я думаю, столбец идентификатора определен как serial в Postgres, и, таким образом, новый идентификатор автоматически извлекается из последовательности, связанной с этим столбцом.

У Oracle нет такой концепции. Если вы не хотите вызывать sequence.nextval вручную (что было бы возможно и с Postgres), вам нужно создать триггер, который назначит следующее значение последовательности для этого столбца.

CREATE OR REPLACE TRIGGER trg_ins_some_table
  BEFORE INSERT ON some_table
  FOR EACH ROW
BEGIN
   :new.id := some_table_id_seq.nextval;
END;
/
...