ACTION

DEFINE ACTION

Задает именованное действие, которое представляют собой параметризуемый блок из нескольких выражений верхнего уровня.

Синтаксис

  1. DEFINE ACTION — объявление действия.
  2. Имя действия, по которому объявляемое действие доступно далее для вызова.
  3. В круглых скобках — список имен параметров.
  4. Ключевое слово AS.
  5. Список выражений верхнего уровня.
  6. END DEFINE — маркер последнего выражения внутри действия.

Один или более последних параметров могут быть помечены знаком вопроса ? как необязательные. Если они не будут указаны при вызове, то им будет присвоено значение NULL.

DO

Выполняет ACTION с указанными параметрами.

Синтаксис

  1. DO — выполнение действия.
  2. Именованное выражение, по которому объявлено действие.
  3. В круглых скобках — список значений для использования в роли параметров.

EMPTY_ACTION — действие, которое ничего не выполняет.

Примечание

В больших запросах объявление действий можно выносить в отдельные файлы и подключать их в основной запрос с помощью EXPORT + IMPORT, чтобы вместо одного длинного текста получилось несколько логических частей, в которых проще ориентироваться. Важный нюанс: директива USE my_cluster; в импортирующем запросе не влияет на поведение объявленных в других файлах действий.

Пример

DEFINE ACTION $hello_world($name, $suffix?) AS
    $name = $name ?? ($suffix ?? "world");
    SELECT "Hello, " || $name || "!";
END DEFINE;

DO EMPTY_ACTION();
DO $hello_world(NULL);
DO $hello_world("John");
DO $hello_world(NULL, "Earth");

BEGIN .. END DO

Выполнение действия без его объявления (анонимное действие).

Синтаксис

  1. BEGIN;
  2. Список выражений верхнего уровня;
  3. END DO.

Анонимное действие не может содержать параметров.

Пример

DO BEGIN
    SELECT 1;
    SELECT 2  -- здесь и в предыдущем примере ';' перед END можно не ставить
END DO

EVALUATE IF

EVALUATE IF — выполнение действия (action) в зависимости от выполнения условия. Далее указывается:

  1. Условие;
  2. DO с именем и параметрами действия или анонимным действием;
  3. Опционально ELSE и следом второе DO для ситуации, когда условие не выполнено.

EVALUATE FOR

EVALUATE FOR — выполнение действия (action) для каждого элемента в списке. Далее указывается:

  1. Именованное выражение, в которое будет подставляться каждый очередной элемент списка;
  2. Ключевое слово IN;
  3. Объявленное выше именованное выражение со списком, по которому будет выполняться действие.
  4. DO с именем и параметрами действия или анонимным действием, в параметрах можно использовать как текущий элемент из первого пункта, так и любые объявленные выше именованные выражения, в том числе сам список.
  5. Опционально ELSE и следом второе DO для ситуации, когда список пуст.

Примеры

DEFINE ACTION $hello() AS
    SELECT "Hello!";
END DEFINE;

DEFINE ACTION $bye() AS
    SELECT "Bye!";
END DEFINE;

EVALUATE IF RANDOM(0) > 0.5
    DO $hello()
ELSE
    DO $bye();

EVALUATE IF RANDOM(0) > 0.1 DO BEGIN
    SELECT "Hello!";
END DO;

EVALUATE FOR $i IN AsList(1, 2, 3) DO BEGIN
    SELECT $i;
END DO;
-- скопировать таблицу $input в $count новых таблиц
$count = 3;
$input = "my_input";
$inputs = ListReplicate($input, $count);
$outputs = ListMap(
    ListFromRange(0, $count),
    ($i) -> {
        RETURN "tmp/out_" || CAST($i as String)
    }
);
$pairs = ListZip($inputs, $outputs);

DEFINE ACTION $copy_table($pair) as
    $input = $pair.0;
    $output = $pair.1;
    INSERT INTO $output WITH TRUNCATE
    SELECT * FROM $input;
END DEFINE;

EVALUATE FOR $pair IN $pairs
    DO $copy_table($pair)
ELSE
    DO EMPTY_ACTION(); -- такой ELSE можно было не указывать,
                       -- ничего не делать подразумевается по умолчанию

Примечание

Стоит учитывать, что EVALUATE выполняется до начала работы операции. Также в рамках EVALUATE невозможно использование анонимных таблиц.

Предыдущая
Следующая