Merge
Префикс Merge может быть добавлен к любому оператору LOAD или SELECT в скрипте для указания, что загруженная таблица должна быть объединена с другой таблицей. Он также указывает, что этот оператор следует выполнять в частичной перезагрузке.
Типичный случай использования — когда загружается журнал изменений, и нужно использовать его для применения inserts, updates и deletes к существующей таблице.
Синтаксис:
Merge [only] [(SequenceNoField [, SequenceNoVar])] On ListOfKeys [Concatenate [(TableName)]] (loadstatement | selectstatement)
Во время обычной (не частичной) перезагрузки конструкция Merge LOAD будет работать как обычный оператор Load, но с дополнительной функциональностью удаления устаревших записей и записей, помеченных на удаление. Первое поле оператора LOAD должно содержать информацию об операции: Insert, Update или Delete.
Для каждой загруженной записи идентификатор записи будет сравниваться с ранее загруженными записями, и только самая последняя запись (в соответствии с порядковым номером) будет сохранена. Если последняя запись помечена как Delete, то ни одна из них не будет сохранена.
Если используется префикс Concatenate или уже существует таблица с тем же набором полей, это будет соответствующая таблица для изменения. В противном случае результат конструкции Merge LOAD будет сохранен в новой таблице.
Если используется префикс Concatenate, результирующая таблица может иметь больше полей, чем журнал изменений, который используется в качестве входных данных для Merge.
При частичной перезарядке произойдет то же самое, что и при полной. Единственное отличие заключается в том, что конструкция Merge LOAD никогда не будет создавать новую таблицу. Для изменения всегда существует соответствующая таблица из предыдущего выполнения скрипта.
Если загруженный журнал изменений является накапливаемым журналом, то есть содержит изменения, которые уже были загружены, параметр SequenceNoVar можно использовать в предложении Where для ограничения количества входных данных. Затем можно сделать так, чтобы констукция Merge LOAD загружала только те записи, в которых поле SequenceNoField больше, чем поле SequenceNoVar. После завершения Merge LOAD присвоит новое значение полю SequenceNoVar с максимальным значением, наблюдаемым в поле SequenceNoField.
Аргументы:
Аргумент | Описание |
---|---|
only | Дополнительный классификатор, указывающий, что оператор должен выполняться только при частичной перезагрузке. Его следует игнорировать при нормальной (нечастичной) перезагрузке. |
SequenceNoField | Имя поля, содержащего временную метку или порядковый номер, определяющий порядок выполнения операций. |
SequenceNoVar |
Имя переменной, которой присваивается максимальное значение для поля SequenceNoField объединяемой таблицы. |
ListOfKeys | Разделенный запятыми список имен полей, определяющих первичный ключ. |
operation | Первое поле оператора LOAD должно содержать операцию: Insert, Update или Delete. ‘i’, ‘u’ и ‘d’ также принимаются. |