Команда UPDATE
Команда UPDATE имеет три варианта использования:
Простой UPDATE
DaJet Script реализует простой вариант команды UPDATE без поддержки общих табличных выражений. Проверить результат работы команды можно, например, при помощи команды SELECT.
DECLARE @table array
DECLARE @record object
USE 'pgsql://postgres:postgres@localhost:5432/database'
UPDATE РегистрСведений.ИсходящиеСообщения
WHERE ТипСообщения = 'Справочник.Номенклатура'
SET Получатель = 'MDM'
, Заголовки = '{ "type": "product" }'
SELECT ТипСообщения, Получатель, Заголовки
INTO @table
FROM РегистрСведений.ИсходящиеСообщения
WHERE ТипСообщения = 'Справочник.Номенклатура'
END
FOR @record IN @table
PRINT @record.ТипСообщения
+ ' => ' + @record.Получатель
+ ' ' + @record.Заголовки
END
Результат выполнения скрипта
[2024-11-24 21:43:25] Справочник.Номенклатура => MDM { "type": "product" }
[2024-11-24 21:43:25] Справочник.Номенклатура => MDM { "type": "product" }
[2024-11-24 21:43:25] Справочник.Номенклатура => MDM { "type": "product" }
UPDATE с возвратом данных
Команда UPDATE “умеет” возвращать значения обновлённых данных в переменную типа array
. Такой вариант команды более оптимален с точки зрения производительности, чем вызов UPDATE с последующим SELECT, так как UPDATE…OUTPUT выполняет только один вызов СУБД. При этом в предложении OUTPUT указываются имена полей значения, которых необходимо вернуть, после выполнения команды UPDATE. Результат возвращается в переменную типа array
, указанную в предложении INTO.
Порядок возвращаемых данных не гарантирован!
DECLARE @table array
DECLARE @record object
USE 'mssql://server/database'
UPDATE РегистрСведений.ИсходящиеСообщения
WHERE ТипСообщения = 'Справочник.Номенклатура'
SET Получатель = 'MDM'
OUTPUT ТипСообщения, Получатель
INTO @table
END
FOR @record IN @table
PRINT @record.ТипСообщения + ' => ' + @record.Получатель
END
Результат выполнения скрипта
[2024-11-24 22:06:42] Справочник.Номенклатура => MDM
[2024-11-24 22:06:42] Справочник.Номенклатура => MDM
Потоковый UPDATE
Если команда UPDATE с предложением OUTPUT возвращает данные в переменную типа object
, то в таком случае процессор DaJet Script интерпретирует её как потоковую, аналогично команде STREAM или CONSUME. То есть потоковая команда UPDATE сначала обновляет данные, а затем возвращает результат по одной записи за раз. Выполняется такая команда в транзакции - вызов исключения откатывает все результаты работы команды UPDATE.
Порядок возвращаемых записей не гарантирован!
DECLARE @message object -- Буфер для обработки одной записи
-- ***********************************************************************
-- * Источник сообщений SQL Server - регистр сведений "ИсходящаяОчередь" *
-- ***********************************************************************
USE 'mssql://server/source_database'
DECLARE @empty_uuid uuid = '00000000-0000-0000-0000-000000000000'
DECLARE @ЭтотУзел string = SELECT Код
FROM ПланОбмена.ПланОбменаДанными
WHERE Предопределённый <> @empty_uuid
UPDATE РегистрСведений.ИсходящаяОчередь
WHERE Статус = Перечисление.СтатусСообщения.Создано
SET Статус = Перечисление.СтатусСообщения.Отправлено
, ДатаВремя = NOW()
OUTPUT ТипСообщения, ТелоСообщения
INTO @message
-- ************************************************************************
-- * Приёмник сообщений PostgreSQL - регистр сведений "ВходящиеСообщения" *
-- ************************************************************************
USE 'pgsql://postgres:postgres@127.0.0.1:5432/target_database'
INSERT РегистрСведений.ВходящиеСообщения
SELECT НомерСообщения = VECTOR('so_incoming_queue')
, Отправитель = @ЭтотУзел
, ТипСообщения = @message.ТипСообщения
, ТелоСообщения = @message.ТелоСообщения
, ОтметкаВремени = NOW()
END -- Контекст базы данных приёмника
END -- Контекст базы данных источника