DB2: Использование NOT EXISTS с SYSIBM.DUAL в сложном пакетном запросе - PullRequest
1 голос
/ 05 сентября 2011

У меня есть данные в объекте java как data1, data2.

data1 и data2 вместе образуют составной ключ в myTable, куда я хочу вставить объект.

Запись происходит какпартияКак 10 операторов вставки подготовлены с использованием 10 объектов и выполняются как пакет.

Я хочу вставить вышеуказанные данные с ограничением: data1 + data2 уже не должны присутствовать в myTable, т.е. data1 + data2 должны быть уникальными - если они уникальны, тогда писать иначе, просто игнорировать.

Я использую следующий запрос:

Insert into mySchema.myTable(column1, column2)
  select 'abc', '123'
  from SYSIBM.DUAL
  where not exists
        ( select 1 
          from mySchema.myTable A 
          where 'abc' = A.column1 
            and '123' = A.column2
        )

Выполнение указанного выше запроса независимо для одного набора данных выполняется успешно.

Однако при запуске в пакетном сценарии я получаю "com.ibm.db2.jcc.b.ie: Неатомный пакетный сбой. "ошибка.

Я думаю, что это как-то связано с использованием SYSIBM.DUAL в пакетном сценарии.

Код, который не работает:

Запрос вставки:

Insert into mySchema.myTable(column1, column2)
select ?,? from SYSIBM.DUAL
where not exists (
  select 1 from mySchema.myTable A
  where ?=A.column1 and ?=A.column2)

Установщики операторов:

ps.setString(1, item.getColumn1());
ps.setString(2, item.getColumn2());
ps.setString(3, item.getColumn1());
ps.setString(4, item.getColumn2());

, где item - это объект java, содержащий двастолбцы для записи.

Ошибка:

org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback;плохая грамматика SQL [вставить в mySchema.myTable (column1, column2) выберите?,?из SYSIBM.DUAL, где не существует (выберите 1 из mySchema.myTable A, где? = A.column1 и? = A.column2)];Вложенное исключение - com.ibm.db2.jcc.b.ie: неатомарная ошибка пакета.Партия была отправлена, но по крайней мере одно исключение произошло с отдельным участником партии.Используйте getNextException (), чтобы получить исключения для определенных пакетных элементов.

...