PL/pgSQL 语句中使用的所有表达式 都由服务器的主 SQL 执行器处理。例如,当你写一条这样的 PL/pgSQL 语句时
IF expression THEN ...
PL/pgSQL 会通过向主 SQL 引擎提交 形如以下的查询来求值该表达式
SELECT expression
在构造 SELECT 命令时,
PL/pgSQL 变量名的所有出现都会被查询参数替换,
如 Section 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 用户并不重要,
但在诊断问题时了解它们会有帮助。
更多信息见 Section 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。)