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';
免责声明这可能是一个更理论化、不切实际的问题。
我正在尝试用 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';