在 PG 14 的文档中,该CREATE FUNCTION
部分的手册说LANGUAGE SQL
函数的主体可以是单个语句:
RETURN expression
或一个块:
BEGIN ATOMIC
statement;
statement;
...
statement;
END
没有对该块的语义给出任何解释。这看起来类似于BEGIN ... END;
PL/pgSQL 中的块,但似乎有所不同。
写一组语句 inside 或 without 有什么区别BEGIN ATOMIC ... END
?什么时候需要使用这样的块?ATOMIC
关键字是强制性的吗?
这是SQL 标准函数的新(在 Postgres 14 中)语法变体。
发行说明:
传统的 Postgres 函数和过程将正文保存为要在执行时解析的文字字符串,通常使用美元引用。看:
新语法
BEGIN ATOMIC ... END
(带有强制ATOMIC
!)不引用在创建时解析的函数体。它只是看起来类似于一个 PL/pgSQL 块,用BEGIN ... END
. 两者都非常不同。新的语法变体只允许用于LANGUAGE sql
. 事实上,这种语言是在没有声明的情况下假设的。手册:您可以编写多个纯 SQL 语句,就像在传统的字符串文字函数或过程体中一样。但一切都是在函数创建时解析的。因此,传统字符串文字形式的“早期绑定”与“后期绑定”。这有许多副作用。手册中
对 SQL 标准语法有很好的解释:
新的语法变体通常更适合简单的 SQL 函数。
代码示例