Проблемы с использованием INSERT INTO ON CONFLICT с использованием запросов WITH - PullRequest
0 голосов
/ 25 октября 2018

Я меняю запросы из базы данных Oracle на PostgreSQL, и в этом запросе я получаю эту ошибку:

 ERROR: syntax error at or near "ON"

запрос:

WITH d as (
      SELECT ? AS summary, ? AS eventTime), ai as (select * from alarm)
ON (ai.fault_id=? AND ai.external_key=?)
INSERT INTO alarm AS ai(
     alarm_id,
     fault_id,
     external_key)
VALUES (nextval('seq_alrm_instnc_alrm_instnc_id'),?,?)
ON CONFLICT DO UPDATE SET
        (${buildUpdateAttributes(attributes)}
        ai.summary = d.summary,
        ai.system_last_update_time = default,
        ai.event_sequence_number =
          CASE
            WHEN (d.event_number > ai.event_number) THEN d.event_number
            ELSE ai.event_number
          END)

Я используюJDBC для подключения к базе данных и вот код вызова

try (PreparedStatement ps = super.prepareStatement_(sql_query)) {
    PreparedStatementHelper psh = new PreparedStatementHelper(ps);
    psh.add(attribute1);
    ...
    ps.execute()

Я пробовал разные подходы и долго смотрел на документацию Postgres и не могу найти, что не так, и не нашел ответа на этот конкретный вопросситуация

1 Ответ

0 голосов
/ 25 октября 2018

Я не совсем понимаю, что вы там пытаетесь сделать, вы неправильно смешали так много элементов синтаксиса, что это действительно трудно понять.

Два CTE (WITH ...) кажутся совершенно неактуальными.Если вы просто хотите указать некоторые значения и выполнить обновление, если ключ UNIQUE нарушен, базовый синтаксис:

insert into the_table (col_1, col_2, col_3, col_4)
values (1,2,3,4)
on conflict (col_1,col_2) do update 
  set col_3 = excluded.col_3,
      col_4 = excluded.col_4;

Специальное ключевое слово excluded используется для ссылки на значение столбца, указанное в VALUES предложение строки, которая вызвала нарушение уникального ограничения.

Ваш CTE предоставляет параметр eventTime, который затем никогда не используется ниже.Предполагая, что это должно быть event_number, тогда, возможно, вы ищете что-то вроде этого:

INSERT INTO alarm 
  -- specify all columns for which you provide a value 
  (alarm_id, fault_id, external_key,summary, event_sequence_number, event_number)
VALUES 
  -- provide a value for each column
  (nextval('seq_alrm_instnc_alrm_instnc_id'), ?, ?, ?, ?, ? )
  -- define the columns of the unique constraint you want to "catch"
ON CONFLICT (fault_id, external_key) 
DO UPDATE SET
   -- "excluded.summary" refers to the corresponding value from the VALUES clause
   summary = excluded.summary, 
   system_last_update_time = default,
   -- excluded.event_number refers to the corresponding value from the VALUES clause
   event_sequence_number = CASE
                             WHEN excluded.event_number > alarm.event_number THEN excluded.event_number
                             ELSE alarm.event_number
                           END
...