PL/pgSQL
或 SQL
中的函数可以定义为 RETURNS void
。最近我发现了结果中的一个奇怪差异。
考虑以下演示:
CREATE OR REPLACE FUNCTION f_sql()
RETURNS void
LANGUAGE sql AS
'SELECT NULL::void'; -- = "do nothing", no special meaning
CREATE OR REPLACE FUNCTION f_plpgsql()
RETURNS void
LANGUAGE plpgsql AS
$func$
BEGIN
NULL; -- = "do nothing", no special meaning
END;
$func$;
函数f_sql()
使用了在SQL函数中只有一个可能的方式,即将SELECT
(作为最后一条命令)用于返回void
类型的函数。我之所以使用它,只是因为它是这个测试目的中最简单的方法——任何其他带有UPDATE
或DELETE
等命令的函数都会显示相同的行为。
现在,void
是一个虚构的类型。虽然plpgsql
函数似乎返回与空字符串等价的void
类型——实际上是''::void
。但sql
函数似乎返回NULL::void
。
db=# SELECT f_sql() IS NULL;
?column?
----------
t
db=# SELECT f_sql()::text IS NULL;
?column?
----------
t
db=# SELECT f_plpgsql() IS NULL;
?column?
----------
f
db=# SELECT f_plpgsql()::text = '';
?column?
----------
t
这可能会产生微妙且令人困惑的副作用。
这种差异背后的原因是什么?
SELECT NULL::void
的有用技巧:顺便说一下,你提供的链接似乎已经失效了(尽管这个技巧在9.3版本中仍然有效)。 - user533832