Skip to the content.

Назад

Команда STREAM

Общее описание

Команда STREAM аналогична команде SELECT - полностью реализует её синтаксис и функциональные возможности: общие табличные выражения, все виды соединений и так далее. Отличаются эти две команды только тем, каким образом процессор DaJet Script их обрабатывает.

Результат выполнения команды SELECT целиком возвращается в переменную типа object или array среды выполнения DaJet Script, то есть в оперативную память программы. Во втором случае, в зависимости от размера выборки данных, это может привести к значительному или даже неприемлемому потреблению ресурсов. После выполнения команды SELECT управление передаётся следующей команде - скрипт выполняется линейно.

Поведение команды STREAM принципиально иное - результат её выполнения возвращается из базы данных не весь сразу, а как поток: циклически по одной записи за один раз. Таким образом команда STREAM может возвращать данные только в переменную типа object. Такая переменная используется DaJet Script как буфер памяти, через который можно “прокачать” огромные объёмы данных. Гораздо большие, чем объём доступной оперативной памяти.

Более того DaJet Script интерпретирует команду STREAM и все, следующие за ней до конца текущего блока выполнения команды, как единый конвейер для обработки потока объектов. Например, если команда STREAM расположена внутри USE (наиболее очевидный и естественный вариант), то конвейер будет завершаться соответствующим ключевым словом END именно той же самой команды USE. Менее очевидным, но тем не менее возможным вариантом, будет размещение команды STREAM в блоках таких команд, как IF, WHILE или FOR. Однако принцип построения конвейера будет тот же - до конца текущего блока. Например, для блока THEN команды IF это будут ключевые слова ELSE или END.

Схематически процесс выполнения команды STREAM можно выразить следующим образом:

Схема выполнения команды STREAM

Таким образом команда STREAM реализует концепцию потокового обмена и обработки данных DaJet Script. Другими командами, реализующими данную концепцию аналогичным образом, являются UPDATE и CONSUME.

Использовать команду STREAM рекомендуется для сценариев переноса данных, предварительного тестирования команды CONSUME, обработки больших объёмов данных и аналогичных задач.

Наверх

Простой пример

DECLARE @record object
DECLARE @counter number = 0

PRINT 'Start streaming'

USE 'mssql://server/database'

   STREAM TOP 10
          Ссылка, Код, Наименование
     INTO @record
     FROM Справочник.Номенклатура
    ORDER BY Ссылка ASC

   PRINT JSON(@record)

   SET @counter = @counter + 1

END

PRINT 'Streamed ' + @counter + ' records'

-- Результат выполнения скрипта
[2024-11-09 15:45:00] Start streaming
[2024-11-09 15:45:00] {"Код":"00000001","Наименование":"Товар 1"}
[2024-11-09 15:45:00] {"Код":"00000002","Наименование":"Товар 2"}
[2024-11-09 15:45:00] {"Код":"00000003","Наименование":"Товар 3"}
[2024-11-09 15:45:00] {"Код":"00000004","Наименование":"Товар 4"}
[2024-11-09 15:45:00] {"Код":"00000005","Наименование":"Товар 5"}
[2024-11-09 15:45:00] {"Код":"00000006","Наименование":"Товар 6"}
[2024-11-09 15:45:00] {"Код":"00000007","Наименование":"Товар 7"}
[2024-11-09 15:45:00] {"Код":"00000008","Наименование":"Товар 8"}
[2024-11-09 15:45:00] {"Код":"00000009","Наименование":"Товар 9"}
[2024-11-09 15:45:00] {"Код":"00000010","Наименование":"Товар 10"}
[2024-11-09 15:45:00] Streamed 10 records

Наверх