WHILE (Script Snowflake)

Um loop WHILE itera enquanto uma condição especificada é verdadeira.

Para obter mais informações sobre loops, consulte Como trabalhar com loops.

Nota

Este constructo do Script Snowflake só é válido dentro de um bloco do Script Snowflake.

Consulte também:

BREAK, CONTINUE

Sintaxe

WHILE ( <condition> ) { DO | LOOP }
    <statement>;
    [ <statement>; ... ]
END { WHILE | LOOP } [ <label> ] ;
Copy

Onde:

condition

Uma expressão que avalia como um BOOLEAN.

statement

Uma instrução pode ser qualquer uma das seguintes opções:

  • Uma única instrução SQL (incluindo CALL).

  • Uma instrução de fluxo de controle (por exemplo, uma instrução de loop ou ramificação).

  • Um bloco aninhado.

label

Uma tag opcional. Tal tag pode ser um destino de salto para uma instrução BREAK ou CONTINUE. Uma tag deve seguir as regras de nomenclatura para Identificadores de objetos.

Notas de uso

  • Coloque a condição no WHILE entre parênteses. Por exemplo: WHILE ( <condição> ).

  • Se condition nunca for avaliado como FALSE e o loop não contiver um comando BREAK (Script Snowflake) (ou equivalente), o loop será executado e consumirá créditos indefinidamente.

  • Se condition for NULL, então ele será tratado como FALSE.

  • Um loop pode conter múltiplas instruções. Você pode usar um BEGIN … END bloco para conter essas instruções, mas isso não é obrigatório.

  • Emparelhe a palavra-chave DO com END WHILE, e emparelhe a palavra-chave LOOP com END LOOP. Por exemplo:

    WHILE (...) DO
        ...
    END WHILE;
    
    WHILE (...) LOOP
        ...
    END LOOP;
    
    Copy

Exemplos

Este exemplo usa um loop para calcular um poder de 2. A variável counter é o contador do loop. A variável power_of_2 armazena a potência de 2 calculada mais recentemente. (Essa é uma solução ineficiente, mas demonstra o loop)

CREATE PROCEDURE power_of_2()
RETURNS NUMBER(8, 0)
LANGUAGE SQL
AS
$$
DECLARE
  counter NUMBER(8, 0);      -- Loop counter.
  power_of_2 NUMBER(8, 0);   -- Stores the most recent power of 2 that we calculated.
BEGIN
  counter := 1;
  power_of_2 := 1;
  WHILE (counter <= 8) DO
    power_of_2 := power_of_2 * 2;
    counter := counter + 1;
  END WHILE;
  RETURN power_of_2;
END;
$$
;
Copy

Chame o procedimento armazenado:

CALL power_of_2();
Copy
+------------+
| POWER_OF_2 |
|------------|
|        256 |
+------------+

Este exemplo usa um loop e a função DATEADD para adicionar um dia a uma data até que a condição seja atendida.

EXECUTE IMMEDIATE $$
BEGIN
  LET mydate := '2024-05-08';
  WHILE (mydate < '2024-05-20') DO
    mydate := DATEADD(day, 1, mydate);
  END WHILE;
  RETURN mydate;
END;
$$
;
Copy
+-------------------------+
| anonymous block         |
|-------------------------|
| 2024-05-20 00:00:00.000 |
+-------------------------+

Para obter mais exemplos, consulte Loop WHILE.