Na documentação do PG 14, na CREATE FUNCTION
seção, o manual diz que o corpo de uma LANGUAGE SQL
função pode ser uma única declaração:
RETURN expression
ou um bloco:
BEGIN ATOMIC
statement;
statement;
...
statement;
END
sem dar qualquer explicação sobre a semântica desse bloco. Isso se parece com um BEGIN ... END;
bloco em PL/pgSQL, mas parece ser algo diferente.
Qual é a diferença entre escrever um conjunto de instruções dentro ou sem BEGIN ATOMIC ... END
? Quando é necessário usar tal bloco? A ATOMIC
palavra-chave é obrigatória?
Essa é a nova (no Postgres 14) variante de sintaxe para funções padrão SQL .
As notas de lançamento:
As funções e procedimentos tradicionais do Postgres salvam o corpo como uma string literal a ser analisada em tempo de execução, normalmente usando cotações de dólares. Ver:
A nova sintaxe
BEGIN ATOMIC ... END
(com obrigatórioATOMIC
!) não cita o corpo da função, que é analisado no momento da criação. Ele só se parece com um bloco PL/pgSQL, que é decorado comBEGIN ... END
. Ambos são muito distintos. A nova variante de sintaxe só é permitida paraLANGUAGE sql
. Na verdade, essa linguagem é assumida sem declaração. O manual:Você pode escrever várias instruções SQL puro, bem como em funções tradicionais de string literal ou corpos de procedimentos. Mas tudo é analisado no momento da criação da função. Portanto, "ligação antecipada" versus "ligação tardia" para a forma tradicional de string literal. Isso tem vários efeitos colaterais.
Há uma boa explicação para a sintaxe padrão do SQL no manual :
A nova variante de sintaxe normalmente será preferível para funções SQL simples.
Exemplo de código