PL/pgSQL 语句中使用的所有表达式都使用服务器的主SQL执行器。例如,当您编写一个类似 PL/pgSQL 的报表时
IF expression
THEN ...
PL/pgSQL 通过提供类似的查询来评估表达式
SELECT expression
到主 SQL 引擎。在形成SELECT
命令时,任何出现的 PL/pgSQL 变量都将用查询参数替换,如 第 41.11.1 节 中详细讨论的内容。这允许 SELECT
的查询计划准备一次,并且可以在不同的变量值下重复使用。因此,在第一次使用表达式时真正发生的是PREPARE
命令。例如,如果我们声明了两个整数变量 x
和 y
,我们写
IF x < y THEN ...
在后台发生的事情等效于
PREPARE statement_name
(integer, integer) AS SELECT $1 < $2;
然后该准备好的报表在每次 IF
语句执行时EXECUTE
d 为 PL/pgSQL 变量作为参数值提供的当前值。一般来说,这些详细信息对于 PL/pgSQL 用户来说并不重要,但是在诊断问题时了解这些细节非常有用。更多信息请参阅 第 41.11.2 节。
由于expression
转换为 SELECT
命令,因此它可以包含普通 SELECT
所包含的相同子句,但它不能包含顶层 UNION
、 INTERSECT
或 EXCEPT
子句。因此,例如,可以用以下方式来测试表是否不为空
IF count(*) > 0 FROM my_table THEN ...
因为 expression
介于 IF
和 THEN
被解析,就好像它是 SELECT count(*) > 0 FROM my_table
。 SELECT
必须生成一列,并且只能生成一行。(如果未生成任何行,结果将视为 NULL。)