如何在PostgreSQL中创建临时函数?

如何在PostgreSQL中创建临时函数?,sql,postgresql,sql-function,Sql,Postgresql,Sql Function,我必须在数据库中执行一个循环。这只是一次性的要求。 在执行了这个函数之后,我现在正在删除这个函数 创建临时/一次性函数有什么好方法吗?如果您使用的是9.0版,您可以使用新的do语句来实现这一点: 对于以前的版本,您需要创建函数,调用它,然后再次删除它。对于ad hock过程,这并不太糟糕。然而,它们的生产效率太低,无法使用 它们可以让您轻松地在数据库中循环sql结果。我需要知道如何在我编写的脚本中多次使用。事实证明,您可以使用pg_temp模式创建一个临时函数。这是一个根据需要为您的连接创建的

我必须在数据库中执行一个循环。这只是一次性的要求。 在执行了这个函数之后,我现在正在删除这个函数


创建临时/一次性函数有什么好方法吗?

如果您使用的是9.0版,您可以使用新的do语句来实现这一点:

对于以前的版本,您需要创建函数,调用它,然后再次删除它。

对于ad hock过程,这并不太糟糕。然而,它们的生产效率太低,无法使用


它们可以让您轻松地在数据库中循环sql结果。

我需要知道如何在我编写的脚本中多次使用。事实证明,您可以使用pg_temp模式创建一个临时函数。这是一个根据需要为您的连接创建的模式,是存储临时表的地方。当您的连接关闭或过期时,此架构将被删除。事实证明,如果在此架构上创建函数,则会自动创建该架构。所以,

create function pg_temp.testfunc() returns text as 
$$ select 'hello'::text $$ language sql;

将是一个功能,只要您的连接保持不变,它就会保持不变。无需调用drop命令。

对以下内容添加几条注释:

  • 即使
    pg_temp
    位于
    search_路径
    (与默认情况相同),该函数必须始终符合架构要求,以防止特洛伊木马:
从而在非临时表上使用临时函数创建普通索引。这样的索引对所有会话都可见,但仍然仅对创建会话有效。查询计划器不会使用函数索引,因为表达式不会在查询中重复。还是有点肮脏的把戏。它将在会话关闭时自动删除-作为依赖对象。感觉这根本不应该被允许


如果你只需要重复执行一个函数,所有你需要的是SQL,那么就考虑一个。它的行为非常类似于在会话结束时终止的临时SQL函数。但是,这不一样,只能与

EXECUTE
一起使用,不能嵌套在另一个查询中。例如:

PREPARE upd_tbl AS
UPDATE tbl t SET set_name = $2 WHERE tbl_id = $1;
电话:

详情:


为什么您认为PostgreSQL中的游标效率低下?循环时,游标会阻塞数据库连接。一个包含数百个长时间运行的游标的网页将导致连接不足,并使网站/数据库瘫痪。。。。它对于在终端上编写脚本很有用,但你不能像“Anomous函数”(或lambda)那样再次调用它,所以DO Station不如“临时函数”有用@PeterKrauss:如果你想再次调用它,你需要创建一个真正的函数。当然,我的回答:-)我只是展示了实现“临时”的理论路径。。。这就是为什么对于主要问题,更好的答案(可能是PostgreSQL)是
pg_temp.foo()
。我不明白为什么(!?)在2014年的今天,语言无法提供如此简单和快速的示例(!)。而且,
DO
语句不能有输入参数,也不能返回结果,这与函数相反。如果它不返回,我们应该称它为“函数”吗?
CREATE INDEX foo_idx ON tbl (pg_temp.f_inc(id));
PREPARE upd_tbl AS
UPDATE tbl t SET set_name = $2 WHERE tbl_id = $1;
EXECUTE upd_tbl(123, 'foo_name');