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

我必须在数据库中执行循环。这只是一次性要求。 执行该函数后,我现在正在删除该函数。 有没有什么好的方法来创建临时/一次性功能?     
已邀请:
我需要知道如何在我写的脚本中多次使用。事实证明,您可以使用pg_temp架构创建临时函数。这是根据您的连接需求创建的模式,也是存储临时表的位置。当您的连接关闭或过期时,将删除此架构。如果在此架构上创建函数,则会自动创建架构。因此,
create function pg_temp.testfunc() returns text as 
$$ select 'hello'::text $$ language sql;
只要你的连接四处奔波,它就会成为一种功能。无需调用drop命令。     
在@ crowmagnumb的答案中,有关智能技巧的其他几点说明: 该函数必须始终是模式限定的,即使
pg_temp
search_path
(默认情况下是这样),根据Tom Lane来防止特洛伊木马:
CREATE FUNCTION pg_temp.f_inc(int)
  RETURNS int AS 'SELECT $1 + 1' LANGUAGE sql IMMUTABLE;

SELECT pg_temp.f_inc(42);
f_inc
-----
43
在临时模式中创建的函数仅在同一会话中可见(就像临时表一样)。它对所有其他会话都是不可见的(即使是相同的角色)。您可以在
SET ROLE
之后在同一会话中以不同的角色访问该功能。 您甚至可以基于此“临时”函数创建功能索引:
CREATE INDEX foo_idx ON tbl (pg_temp.f_inc(id));
从而在非临时表上使用临时函数创建普通索引。这样的索引对所有会话都是可见的,但仍然只对创建会话有效。查询计划程序将不使用功能索引,其中表达式不会在查询中重复。还是有点肮脏的把戏。它会在会话关闭时自动删除 - 作为依赖对象。不应该允许这样的感觉...... 如果您只需要重复执行一个函数并且只需要SQL,那么请考虑使用预准备语句。它的行为很像临时SQL函数,在会话结束时死掉。但是,它不是同一个东西,只能用于
EXECUTE
,而不是嵌套在另一个查询中。例:
PREPARE upd_tbl AS
UPDATE tbl t SET set_name = $2 WHERE tbl_id = $1;
呼叫:
EXECUTE upd_tbl(123, 'foo_name');
细节: 拆分给定字符串并准备case语句     
如果您使用的是9.0版,则可以使用新的DO语句执行此操作: http://www.postgresql.org/docs/current/static/sql-do.html 对于以前的版本,您需要创建函数,调用它,然后再次删除它。     
对于广告程序,游标也不算太糟糕。然而,它们对于产品的使用效率太低。 它们可以让你轻松地在db中循环sql结果。     

要回复问题请先登录注册