Translate

Pesquisar este blog

sexta-feira, 19 de junho de 2015

Introdução à Linguagem PL/PGSQL do PostgreSQL - Parte 2.

Controle de fluxo.

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;

Nenhum comentário:

Postar um comentário