【发布时间】:2017-07-11 07:46:34
【问题描述】:
免责声明这可能是一个更理论、更不切实际的问题。
我正在尝试用sql 函数替换plpgsql 函数不改变行为或结果类型。函数如下所示:
create function f() returns void as
$$
begin
perform some_other_function(my_table.my_column)
from my_table;
end;
$$
language plpgsql volatile;
这个函数返回void,因为我不关心结果。
如前所述,我正在尝试用 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 也返回一个 void。
还有其他聪明的尝试方法吗?
【问题讨论】:
-
如果我们不知道正在实现什么功能,这很难回答。
-
some_other_function(id)在某个日志记录表中创建一个新行。所以,f()的解释:对于my_table中的每一行,我使用some_other_function(id)在某处创建一行。 -
select count(some_other_function(my_table.my_column))::text::void from my_table; -
select exists(some_other_function(my_table.my_column))::text::void from my_table;也许快一点?或者 PostgreSQL 会因为exists已经完成而在第一行之后优化并停止? -
如果您不打算在每个语句中调用此函数数千次 - 最好简单。与读/写操作相比,
plpgsql的一些可能的额外系统资源也非常小。
标签: postgresql plpgsql sql-function