如何在PostgreSQL中创build一个临时函数?
我必须在数据库中执行一个循环。 这只是一次性的要求。 执行该函数后,我现在正在放弃该function。
有创build临时/一次性function有什么好方法吗?
我需要知道如何在我写的脚本中使用很多次。 原来你可以使用pg_temp模式创build一个临时函数。 这是根据您的连接需求创build的模式,也是存储临时表的地方。 当连接closures或过期时,该架构将被丢弃。 如果你在这个模式上创build一个函数,就会自动创build模式。 因此,
create function pg_temp.testfunc() returns text as $$ select 'hello'::text $$ language sql;
将是一个function,只要你的连接坚持周围坚持。 无需调用放置命令。
如果您使用的是9.0版本,则可以使用新的DO语句执行此操作:
http://www.postgresql.org/docs/current/static/sql-do.html
对于以前的版本,您需要创build函数,调用它,然后再次删除它。
@ 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
-
在临时模式中创build的函数只在同一个会话内部可见(就像临时表一样)。 对所有其他会话都是不可见的(即使是同一个angular色)。 在
SET ROLE
之后,您可以在同一个会话中以不同的angular色访问该函数。 -
你甚至可以根据这个“temp”函数创build一个函数索引:
CREATE INDEX foo_idx ON tbl (pg_temp.f_inc(id));
从而在非临时表上使用临时函数创build一个简单的索引。 这样的索引对所有会话都是可见的,但只对创build会话有效。 查询计划程序将不使用function索引,其中expression式在查询中不重复。 仍然有点肮脏的伎俩。 它将在会话closures时自动删除 – 作为依赖对象。 这样的感觉不应该被允许…
如果您只需要重复执行一个函数,并且只需要SQL,就应该考虑一个准备好的语句 。 它很像在会话结束时死亡的临时SQL函数 。 不过,并不是一回事,只能由其自身使用,而不是在更大的查询中使用。
例:
PREPARE upd_tbl AS UPDATE tbl t SET set_name = $2 WHERE tbl_id = $1;
呼叫:
EXECUTE upd_tbl(123, 'foo_name');
细节:
- 拆分给定的string,并准备case语句
对于广告程序来说, 游标并不算太坏。 然而,它们对产品使用来说效率太低。
他们会让你轻松循环在数据库中的SQL结果。