在 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 节。
由于将 表达式
转换为 SELECT
命令,因此它可以包含普通 SELECT
所能包含的相同子句,但它不能包含顶层 UNION
、INTERSECT
或 EXCEPT
子句。因此,例如,可以使用以下语句测试表是否为空:
IF count(*) > 0 FROM my_table THEN ...
因为 IF
和 THEN
之间的 表达式
被解析为它像 SELECT count(*) > 0 FROM my_table
一样。SELECT
必须产生单列,并且不能产生超过一行。(如果它不产生任何行,则结果被视为 NULL。)
如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符或需要进一步说明,请使用 此表格 报告文档问题。