#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;