PL/pgSQL语句中使用的所有表达式都会由服务器的主SQL执行器处理。例如,当你写下这样一条PL/pgSQL语句时:
IF expression THEN ...
PL/pgSQL会通过向主 SQL 引擎送入如下查询
SELECT expression
来计算该表达式。如Section 41.11.1中详细讨论的那样,在构造该SELECT命令时,PL/pgSQL变量名的每一次出现都会被替换成查询参数。这使得该SELECT的查询计划只需准备一次,然后就能在后续以不同变量值求值时重用。因此,表达式第一次被使用时,实际发生的事情本质上相当于执行了一条PREPARE命令。例如,如果已经声明了两个整数变量x和y,并写下
IF x < y THEN ...
那么幕后发生的事情等效于
PREPARE statement_name(integer, integer) AS SELECT $1 < $2;
然后,在每次执行IF语句时,这条预备语句都会以当前PL/pgSQL变量值作为参数值被EXECUTE。通常这些细节对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。)
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。