Oracle, JDBI @SqlBatch - получить все строки, затронутые INSERT

У меня есть база данных Oracle 12c. Там есть таблица Артефакты. Таблица выглядит так:

ID | BONETYPE | AGE

ID - это NUMBER(12,0) ВСЕГДА СОЗДАВАЕМАЯ КАК ИДЕНТИЧНОСТЬ, поэтому база данных назначает их при вставке артефактов. BONETYPE и AGE - это просто строки. Существует уникальное ограничение на BONETYPE и AGE.

У меня есть запрос к базе данных для вставки отсутствующих записей, который выглядит так:

INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(Artifacts, U_ARTIFACTS) */
INTO Artifacts ("BONETYPE", "AGE")
VALUES ('dinosaur', '800000');

Странная подсказка IGNORE_ROW_ON_DUPKEY_INDEX связана с тем, что некоторые из этих артефактов, возможно, уже были вставлены.

Этот запрос к базе данных фактически выдается через запрос JDBI:

@SqlBatch("INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(Artifacts, U_ARTIFACTS) */\n" +
          "INTO Artifacts ( \"BONETYPE\", \"AGE\" )\n" +
          "VALUES ( :BoneType, :Age )")
@GetGeneratedKeys(columnName = "ID", value = OracleGeneratedKeyMapper.class)
int[] putArtifacts(@Bind("BoneType") List<String> boneTypes, @Bind("Age") List<String> ages);

Это @SqlBatch по соображениям производительности.

Проблема, с которой я столкнулся сейчас, заключается в том, что я хочу знать IDs всех затронутых строк, включая те, которые были проигнорированы из-за подсказки IGNORE_ROW_ON_DUPKEY_INDEX. Как я могу это сделать?

@GetGeneratedKeys дает мне только IDs строк отсутствующих записей.


person skjohann    schedule 16.03.2017    source источник


Ответы (1)


Короткий ответ: вы не можете этого сделать. Вы должны написать хранимую процедуру, чтобы получить все IDs

person skjohann    schedule 29.05.2017