PostgreSQL:用 sql 函数替换 plpgsql 函数

PostgreSQL: replace plpgsql function by sql function

免责声明这可能是一个更理论化、不切实际的问题。

我正在尝试用 sql 函数 替换 plpgsql 函数而不改变行为或结果类型 。该函数如下所示:

create function f() returns void as
$$
begin
    perform       some_other_function(my_table.my_column)
    from          my_table;
end;
$$
language plpgsql volatile;

这个函数returnsvoid,因为我不关心结果。

如前所述,我正在尝试用 sql 函数替换它。此函数用于 sql 函数链中,因此从性能角度来看,将此函数也作为 sql 函数而不是 plpgsql 可能会更好(再次参见免责声明)。

以下不起作用,因为现在只处理了 my_table 的第一行。

create function f() returns void as
$$
    select       some_other_function(my_table.my_column)
    from         my_table;
$$
language sql volatile;

请注意,函数 some_other_function 也 returns 无效。

还有其他巧妙的尝试方法吗?

您可以使用 SQL 语句,该语句必须先扫描整个 table,然后才能生成第一个结果行,例如

CREATE OR REPLACE FUNCTION f() RETURNS void
   LANGUAGE sql STABLE AS
'SELECT count(CASE
                WHEN some_other_function(my_table.my_column) IS NULL
                THEN 0
             END
       )::text::void
FROM my_table';

CREATE OR REPLACE FUNCTION f() RETURNS void
   LANGUAGE sql STABLE AS
'SELECT count(*)::text::void
FROM (
      SELECT some_other_function(my_table.my_column)
      FROM my_table
     ) q';