Specifies a named action that is a parameterizable block of multiple top-level expressions.
DEFINE ACTION
: action definition.AS
keyword.END DEFINE
: The marker of the last expression inside the action.One or more of the last parameters can be marked with a question mark ?
as optional. If they are omitted during the call, they will be assigned the NULL
value.
Executes an ACTION
with the specified parameters.
DO
: Executing an action.EMPTY_ACTION
: An action that does nothing.
{% note info %}
In large queries, you can use separate files for action definition and include them to the main query using EXPORT + IMPORT so that instead of one long text you can have several logical parts that are easier to navigate. An important nuance: the USE my_cluster;
directive in the import query does not affect behavior of actions declared in other files.
{% endnote %}
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");
Performing an action without declaring it (anonymous action).
BEGIN
.END DO
.An anonymous action can't include any parameters.
DO BEGIN
SELECT 1;
SELECT 2 -- here and in the previous example, you might omit ';' before END
END DO
EVALUATE IF
: Executing an action depending on the condition. It's followed by:
ELSE
followed by the second DO
for a situation where the condition is not met.EVALUATE FOR
: Executing an action for each item in the list. It's followed by:
IN
keyword.ELSE
followed by the second DO
for the situation when the list is empty.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;
-- copy the $input table to $count of new tables
$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 (); -- you may omit this ELSE,
-- do nothing is implied by default
{% note info %}
Note that EVALUATE
is run before the operation starts.
{% endnote %}