Команда EXECUTE
Вызов одного скрипта DaJet Script из другого выполняется при помощи команды EXECUTE. Синтаксис этой команды выглядит следующим образом:
EXECUTE 'file://<script>' [DEFAULT 'file://<default-script>'] [WITH <parameters>] [INTO <variable>]
<script> - путь или шаблон пути к файлу вызываемого скрипта относительно корневого каталога выполнения утилиты или сервера DaJet.
<default-script> - (опционально) альтернативный путь или шаблон скрипта, вызываемого в том случае, когда основной скрипт не был найден по указаному для него шаблону. Если для основного скрипта указан конкретный путь, а не шаблон, то опция команды DEFAULT не используется.
<parameters> - (опционально) сопоставление имён параметров вызываемого и вызывающего скриптов.
<variable> - (опционально) переменная вызывающего скрипта, в которую вызываемый скрипт возвращает результат своего выполнения при помощи команды RETURN.
Опция DEFAULT используется только в том случае, когда для основного скрипта указан шаблон. Если по шаблону файл не будет найден, то выполняется попытка выполнить скрипт по умолчанию. Если опция DEFAULT не указана или альтернативный скрипт не будет найден, то возникает исключительная ситуация (ошибка).
Если предложение WITH команды EXECUTE не используется, тогда вызываемый скрипт выполняется без передачи в него каких-либо параметров. Если же не используется предложение INTO, тогда скрипт выполняется в качестве процедуры, невозвращающей никакого значения.
Скрипты могут вызываться рекурсивно, то есть скрипт может вызывать сам себя.
Обычный путь к файлу вызываемого скрипта выглядит следующим очевидным образом:
EXECUTE 'file://script.djs'
Шаблон пути к файлу вызываемого скрипта включает в себя переменные или обращения к свойствам объектов типа object
для динамической подстановки значений (переменные шаблона). Эти переменные заключаются в фигурные скобки {
и }
. Например, если есть каталог scripts
, то динамическое обращение к скриптам, расположенным в нём, выполняется следующим образом:
DECLARE @file string = 'script1.djs'
EXECUTE 'file://scripts/{@file}'
-- После подстановки значения переменной @file в шаблон,
-- путь к файлу вызываемого скрипта будет выглядеть так:
-- file://scripts/script1.djs
Рассмотрим простой пример вызова внешнего скрипта. В этом примере callee.djs
- это вызываемый внешний скрипт, а caller.djs
- вызывающий (корневой) скрипт. Предположим, что оба скрипта находятся в корне каталога выполнения утилиты или сервера DaJet.
-- **************
-- * callee.djs *
-- **************
DECLARE @input string -- Входящий параметр
DECLARE @result string -- Возвращаемый результат
SET @result = 'Hello, ' + @input + '!'
RETURN @result
-- **************
-- * caller.djs *
-- **************
DECLARE @input string -- Передаваемый во внешний скрипт параметр
DECLARE @output string -- Результат выполнения скрипта
SET @input = 'caller'
EXECUTE 'file://callee.djs'
WITH input = @input -- Сопоставление входящего параметра
INTO @output -- Переменная для получения возврата
RETURN @output
-- Результат выполнения скрипта:
-- Hello, caller!
Пример выше показывает каким образом, при помощи предложения WITH и знака равенства =
, выполняется сопоставление входящих параметров вызываемого скрипта и переменных вызывающего. Слева от знака =
указывается имя переменной вызываемого скрипта без специального символа @
, а справа - полное имя переменной вызывающего скрипта, значение которой нужно передать. Если входящих параметров больше одного, то пары сопоставления отделяются друг от друга при помощи символа ,
(запятой).
Пример рекурсивного вызова
Скрипт starter.djs
- вызывает рекурсивный скрипт, “стартует” рекурсию.
Скрипт recursive.djs
- рекурсивный скрипт, вызывающий в цикле сам себя.
-- ***************
-- * starter.djs *
-- ***************
DECLARE @counter number = 0
PRINT 'ROOT START : ' + @counter
EXECUTE 'file://recursive.djs'
WITH counter = @counter
INTO @counter
PRINT 'ROOT END : ' + @counter
-- *****************
-- * recursive.djs *
-- *****************
DECLARE @counter number -- Входящий параметр
PRINT 'START: ' + @counter
WHILE @counter < 3
PRINT 'EXECUTE: ' + @counter
SET @counter = @counter + 1
EXECUTE 'file://recursive.djs'
WITH counter = @counter
INTO @counter
END
PRINT 'END: ' + @counter
RETURN @counter
Результат выполнения скрипта starter.djs
:
[2024-10-14 19:47:30] ROOT START : 0
[2024-10-14 19:47:30] START: 0
[2024-10-14 19:47:30] EXECUTE: 0
[2024-10-14 19:47:30] START: 1
[2024-10-14 19:47:30] EXECUTE: 1
[2024-10-14 19:47:30] START: 2
[2024-10-14 19:47:30] EXECUTE: 2
[2024-10-14 19:47:30] START: 3
[2024-10-14 19:47:30] END: 3
[2024-10-14 19:47:30] END: 3
[2024-10-14 19:47:30] END: 3
[2024-10-14 19:47:30] END: 3
[2024-10-14 19:47:30] ROOT END : 3