WHILE

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

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

Consulte também

BREAK, CONTINUE

Sintaxe

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

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 (ex.: instrução de looping 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 o condition nunca avalia como FALSE, e o loop não contém um comando BREAK (ou equivalente), então o laço 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, mas não é obrigatório, um BEGIN … END bloco para conter essas instruções.

  • A palavra-chave DO deve ser emparelhada com END WHILE e a palavra-chave LOOP deve ser emparelhada com END LOOP. Por exemplo:

    while (...) do
        ...
    end while;
    
    while (...) loop
        ...
    end loop;
    

Exemplo

Este exemplo usa um loop para calcular um poder de 2. (Esta é uma solução ineficiente, mas demonstra o looping).

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;
$$
;

Aqui está o resultado da execução do procedimento armazenado:

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