Вставка запроса слияния, но не обновление в Oracle - PullRequest
0 голосов
/ 29 января 2019

Я получил этот запрос в аннотации @ SQLInsert в Spring для базы данных Oracle 11g и, хотя он вставляется правильно, он не обновляет значения, но не вызывает ошибок.

Есть идеи?Если нет, то есть ли альтернативные способы получить такое же поведение?

merge INTO ngram sn
USING(SELECT ? AS frequency,
             ? AS occurrences,
             ? AS ngram
      FROM   dual) src
ON (sn.ngram = src.ngram)
WHEN matched THEN
  UPDATE SET sn.occurrences = sn.occurrences + src.occurrences,
             sn.frequency = sn.frequency + 1
WHEN NOT matched THEN
  INSERT (ngram,
          frequency,
          occurrences)
  VALUES (src.ngram,
          src.frequency,
          src.occurrences) 

Update1: Я добавляю определение Entity в Java для пояснения.

@Entity(name = "NGRAM")
public class Ngram
{
    @Id
    @JsonProperty("ngram")
    private String ngram;

    @JsonProperty("frequency")
    @Column(name = "frequency")
    private int frequency;

    @JsonProperty("occurrences")
    @Column(name = "occurrences")
    private int occurrences;

Update2: Добавление прогона SQL-запроса к существующей Ngram

sql> merge INTO NGRAM sn
     USING(SELECT 1 AS frequency,
                  200 AS occurrences,
                  'year' AS ngram
           FROM   dual) src
     ON (sn.ngram = src.ngram)
     WHEN matched THEN
       UPDATE SET sn.occurrences = sn.occurrences + src.occurrences,
                  sn.frequency = sn.frequency + 1
     WHEN NOT matched THEN
       INSERT (ngram,
               frequency,
               occurrences)
       VALUES (src.ngram,
               src.frequency,
               src.occurrences)
[2019-01-29 12:09:10] 1 row affected in 19 ms

Это на самом деле изменяет строку, но не когда я просматриваю их в коде, поэтому кажется, что SQLправильно ...

Update3: Итак, это фрагмент кода, который должен быть вставлен или обновлен, но он выполняет только вставку:

    List<Ngram> lNgrams = new ArrayList<>(lCollocationsMap.size());
    lCollocationsMap.forEach((pKey, pValue) -> lNgrams.add( new Ngram(pKey, 1, pValue)));
    mNgramRepo.saveAll(lNgrams);

Так что яЯ буду исследовать поведение saveAll .

Update4: Я пытался использовать save один за другим, что намного медленнее, чем saveAll , но получил то же поведение.Изменение ON (sn.ngram = src.ngram) на ON (sn.ngram LIKE src.ngram) делает некоторые частоты равными 2 (поэтому они, похоже, обновляются)но не все из них: например, «год» появляется более 10 раз, но его частота остается равной 1, а его вхождения просто обновляются с последним найденным значением.

Итак, теперь я полностью растерялся, почему этоне удается, особенно таким образом.

...