Toda linguagem de programação têm controle de fluxo, que são
instruções IF, CASE, FOR, WHILE, FUNCTION, etc.
Declaração de variável local:
CREATE OR REPLACE FUNCTION myfunction(entrada integer)
RETURNS integer AS
$BODY$
declare
i int;
v varchar(200);
rec record;
begin
...
IF-THEN-ELSE:
IF <condição SQL> THEN
<instrução>;
<instrução>;
ELSIF <condição SQL> THEN
<instrução>;
<instrução>;
ELSE
<instrução>;
<instrução>;
END IF;
LOOP-END LOOP:
LOOP
<instrução>;
<instrução>;
EXIT WHEN <condição SQL>;
<instrução>;
<instrução>;
END LOOP;
* Observação: A instrução EXIT WHEN pode ser usada em qualquer lugar dentro do loop.
RECORD IN SELECT LOOP-END LOOP:
declare
rec record;
begin
FOR rec IN select id, nome from tabela order by nome
LOOP
<instrução>;
<instrução>;
END LOOP;
...
* Observação: É preciso criar uma variável do tipo record ou rowtype para usar nesse tipo de loop;
Arrays:
Arrays de qualquer tipo de dados podem ser declarados. Coloca-se o tipo de dados seguido de [].
declare
arr varchar[];
str varchar;
begin
arr:=array(select nome from usuario limit 100); --Aqui definimos com um SELECT em uma tabela.
arr:=ARRAY['Zé', 'Fulano', 'Ciclano']; --Colchetes é diferente de parênteses.
arr:=string_to_array('Zé;Fulano;Beltrano', ';'); --É possível expandir varchar delimitado para array.
str:=array_to_string(arr, ';'); --O oposto também é possível.
arr:=arr||'Lóide'; --Concatenando um array.
IF array_length(arr, 1)>5 THEN --Retornando o tamanho de um array.
...
END IF;
FOR str IN SELECT unnest(arr) --Estamos fazendo um LOOP com o array.
LOOP
<instrução>;
<instrução>;
END LOOP;
end;
CASE (com variável):
CASE var
WHEN <valor1>,<valor2> THEN
<instrução>;
<instrução>;
WHEN <valor3>,<valor4> THEN
<instrução>;
<instrução>;
...
ELSE
<instrução>;
<instrução>;
END CASE;
CASE (sem variável):
CASE
WHEN <condição1> THEN
<instrução>;
<instrução>;
WHEN <condição2> THEN
<instrução>;
<instrução>;
...
ELSE
<instrução>;
<instrução>;
END CASE;
FOR:
FOR i IN 1..10 --i vai de 1 a 10
LOOP <instrução>;
<instrução>; END LOOP; FOR i IN REVERSE 10..1 --i vai de 10 a 1
LOOP <instrução>;
<instrução>;
END LOOP; FOR i IN REVERSE 10..1 BY 2 --i vai de 10,8,6,4,2
LOOP <instrução>;
<instrução>;
END LOOP;