所有在 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
这个预备语句,并将 PL/pgSQL 变量的当前值作为参数值提供。通常,这些细节对 PL/pgSQL 用户来说并不重要,但在尝试诊断问题时它们很有用。更多信息出现在 第 41.11.2 节中。
由于一个 expression
被转换为 SELECT
命令,它可以包含一个普通的 SELECT
会包含的相同子句,除了它不能包含顶级的 UNION
、INTERSECT
或 EXCEPT
子句。因此,例如,可以使用以下命令测试一个表是否为空:
IF count(*) > 0 FROM my_table THEN ...
因为 IF
和 THEN
之间的 expression
被解析为 SELECT count(*) > 0 FROM my_table
。 SELECT
必须生成单列,并且不超过一行。(如果它不产生任何行,则结果被视为 NULL。)
如果您在文档中发现任何不正确,与您使用特定功能的体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。