7.1.3. Estruturas Condicionais
Em PL/pgSQL
temos dois tipos de comandos condicionais: if-then-else
e case-when
.
A sintaxe de comandos if-then-else
é a seguinte:
IF condição THEN
comandos;
[ELSIF condição THEN
comandos;]
[ELSE
comandos;]
END IF;
Comandos case-when
possuem a seguinte sintaxe:
CASE search-expression
WHEN expressão [, expressão [ ... ]] THEN
comandos
[WHEN expressão [, expressão [ ... ]] THEN
comandos]
[ELSE
comandos]
END CASE;
No exemplo da função my_distance
, se considerarmos que a distância entre os pontos só pode ser computada caso eles se encontrem no mesmo sistema de referência espacial, poderíamos reescrever a função da seguinte forma:
CREATE OR REPLACE FUNCTION my_distance(first GEOMETRY, second GEOMETRY)
RETURNS NUMERIC
AS
$$
DECLARE
dx NUMERIC DEFAULT 0.0;
dy NUMERIC DEFAULT 0.0;
d NUMERIC DEFAULT 0.0;
BEGIN
IF(ST_SRID(first) <> ST_SRID(second)) THEN
return NULL;
END IF;
dx := ST_X(first) - ST_X(second);
dy := ST_Y(first) - ST_Y(second);
d := sqrt(power(dx, 2) + power(dy, 2));
RETURN d;
END;
$$
LANGUAGE plpgsql;
Repare que agora, se chamarmos a função para um par de pontos em diferentes sistemas de coordenadas, receberemos um valor nulo (NULL
) como retorno:
SELECT my_distance(
ST_GeometryFromText('POINT(0 0)', 4326),
ST_GeometryFromText('POINT(1 1)', 29193));
No entanto, ao invés de retornarmos um valor NULL
o mais adequado seria interromper a execução da função indicando algum tipo ou condição de erro. A seção a seguir mostra como podemos proceder nestes casos.