Как обойти ограничение инструкции Oracle MERGE

#sql #oracle #plsql

#sql #Oracle #plsql

Вопрос:

Я хочу обновить еще две переменные, т. Е. ‘earliest_id только при обновлении earliest_timestamp’ и ‘latest_id только при обновлении latest_timestamp’. Есть ли какой-либо способ сделать это в приведенном ниже слиянии. Кроме того, если у вас, ребята, есть альтернативные решения для проблемы чтения, изменения и записи, приведенной ниже, пожалуйста, поделитесь ею со мной

 BEGIN
MERGE INTO mytable
USING dual ON (id1 = ? AND ...)
WHEN NOT MATCHED THEN
INSERT (...) VALUES (...)
WHEN MATCHED THEN UPDATE 
SET earliest_timestamp = least(lEarliest, earliest_timestamp), 
    latest_timestamp   = greatest(lLatest, latest_timestamp) 
    where earliest_timestamp > lEarliest or latest_timestamp < lLatest;
END;
/
  

Комментарии:

1. Вы вставляете значения, если они не найдены, или вы только хотите обновить?

2. Вы, скорее всего, получите значимый ответ, если предоставите DDL для таблиц, DML для создания данных для демонстрации проблемы, минимальный код для демонстрации проблемы и сообщение об ошибке.

3. Какое ограничение merge вы имеете в виду? Под «переменными» вы подразумеваете «столбцы»? Что такое lEarliest и lLatest ? Кстати, заключающие begin ... end; ключевые слова не добавляют никакой функциональности, кроме изменения сообщения о завершении с n строк, объединенных , на успешно завершенную процедуру PL / SQL.

Ответ №1:

Также нет необходимости использовать dual table, поскольку вы обновляете одну таблицу, вы можете использовать update statement вместо merge .

 update mytable
set earliest_timestamp = least(lEarliest, earliest_timestamp), 
    latest_timestamp   = greatest(lLatest, latest_timestamp) 
    where earliest_timestamp > lEarliest or latest_timestamp < lLatest;