7.1.1. Introdução

A linguagem PL/pgSQL1 permite que comandos SQL sejam executados dentro de uma linguagem procedural, isto é, de uma linguagem com comandos de decisão (if-then-else) e repetição (laços do-while), e que facilita o trabalho de manipulação do resultado da execução de consultas.

O comando CREATE FUNCTION permite definir funções escritas em PL/pgSQL, cuja sintaxe geral é a seguinte2,3:

CREATE OR REPLACE FUNCTION nome-da-função(parâmetros)
RETURNS tipo-retorno
AS
$$
[<<rótulo>>]
[DECLARE
    declaração-variáveis;]
BEGIN
    comandos;
    [EXCEPTION
        [WHEN condição THEN
            comandos;
    ...]]
END [rótulo];
$$
LANGUAGE plpgsql;

Vamos começar criando uma função chamada my_distance capaz de computar a distância euclidiana entre dois pontos. O código desta função é mostrado a seguir:

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

As funções PL/pgSQL podem ser usadas em qualquer parte das consultas SQL onde uma função comum possa ser incluída. Uma vez criada, uma função pode ser chamada de dentro de uma consulta submetida tanto do lado cliente quanto do lado servidor. No entanto, a execução da função ocorrerá sempre do lado servidor.

Para executar a função my_distance podemos utilizar uma consulta do tipo SELECT usando uma das duas construções:

SELECT my_distance(
           ST_GeometryFromText('POINT(0 0)', 4326),
           ST_GeometryFromText('POINT(1 1)', 4326));

ou:

SELECT *
  FROM my_distance(
           ST_GeometryFromText('POINT(0 0)', 4326),
           ST_GeometryFromText('POINT(1 1)', 4326));

Nota

A partir das versões 9.0 do PostgreSQL, o suporte PL/pgSQL é registrado no banco template1 criado durante a instalação do servidor. Dessa maneira, os bancos de dados criados a partir desse template já possuem a extensão habilitada e pronta para uso. Para saber se a extensão plpgsql encontra-se habilitada para seu banco de dados, consulte a tabela pg_extension, como mostrado abaixo:

SELECT extname FROM pg_extension ORDER BY extname;

Saída:

  extname
------------
 plpgsql
 postgis
(2 rows)

Notas

1

PL vem de Programming Language.

2

Para maiores detalhes da sintaxe da linguagem PL/pgSQL, consulte Chapter 43. PL/pgSQL — SQL Procedural Language.

3

As partes entre [ e ] são opcionais.