我必须在数据库中执行循环。这只是一个时间要求。执行完函数后,我现在要删除函数。
有什么好的方法可以创建临时/一次性功能?
Answers:
@crowmagnumb的答案中有关智能技巧的一些附加说明:
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');
细节:
如果您使用的是9.0版,则可以使用新的DO语句执行此操作:
http://www.postgresql.org/docs/current/static/sql-do.html
在以前的版本中,您需要创建函数,调用它并再次将其删除。
DO
与函数相反,语句不能具有输入参数,也不能返回结果。
对于Ad Hock过程,游标还不错。但是,它们对于生产使用而言效率太低。
它们将使您轻松地在db中循环执行sql结果。