Skip to the content.

Назад

Команда 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 -- Контекст базы данных источника

Наверх