在PL/pgSQL语句中使用的所有表达式都由服务器的主执行器处理。SQL例如,当你写一个PL/pgSQL语句时,例如
IF expression
THEN ...
PL/pgSQL 会通过向主 SQL 引擎提供类似以下的查询来评估表达式:
SELECT expression
在构造 SELECT
命令时,PL/pgSQL 变量名的任何出现都会被替换为查询参数,这在第 41.11.1 节中有详细讨论。这使得 SELECT
的查询计划可以只准备一次,然后在后续的表达式计算中使用不同的变量值重复使用。因此,在表达式首次使用时实际发生的事情本质上是一个 PREPARE
命令。例如,如果我们声明了两个整数变量 x
和 y
,并且我们写了
IF x < y THEN ...
幕后发生的事情等同于
PREPARE statement_name
(integer, integer) AS SELECT $1 < $2;
然后,对于每次执行 IF
语句,都会执行此准备好的语句,并将 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。)
如果您在文档中发现任何不正确、与您在特定功能上的实际体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。