ACTION
DEFINE ACTION
Задает именованное действие, которое представляют собой параметризуемый блок из нескольких выражений верхнего уровня.
Синтаксис
DEFINE ACTION
— объявление действия.- Имя действия, по которому объявляемое действие доступно далее для вызова.
- В круглых скобках — список имен параметров.
- Ключевое слово
AS
. - Список выражений верхнего уровня.
END DEFINE
— маркер последнего выражения внутри действия.
Один или более последних параметров могут быть помечены знаком вопроса ?
как необязательные. Если они не будут указаны при вызове, то им будет присвоено значение NULL
.
DO
Выполняет ACTION
с указанными параметрами.
Синтаксис
DO
— выполнение действия.- Именованное выражение, по которому объявлено действие.
- В круглых скобках — список значений для использования в роли параметров.
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
Выполнение действия без его объявления (анонимное действие).
Синтаксис
BEGIN
;- Список выражений верхнего уровня;
END DO
.
Анонимное действие не может содержать параметров.
Пример
DO BEGIN
SELECT 1;
SELECT 2 -- здесь и в предыдущем примере ';' перед END можно не ставить
END DO
EVALUATE IF
EVALUATE IF
— выполнение действия (action) в зависимости от выполнения условия. Далее указывается:
- Условие;
- DO с именем и параметрами действия или анонимным действием;
- Опционально
ELSE
и следом второеDO
для ситуации, когда условие не выполнено.
EVALUATE FOR
EVALUATE FOR
— выполнение действия (action) для каждого элемента в списке. Далее указывается:
- Именованное выражение, в которое будет подставляться каждый очередной элемент списка;
- Ключевое слово
IN
; - Объявленное выше именованное выражение со списком, по которому будет выполняться действие.
- DO с именем и параметрами действия или анонимным действием, в параметрах можно использовать как текущий элемент из первого пункта, так и любые объявленные выше именованные выражения, в том числе сам список.
- Опционально
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
невозможно использование анонимных таблиц.