7.1.1. Introdução
A linguagem PL/pgSQL
1 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.