我必须在数据库中执行一个循环。这只是一次性的要求。执行完函数后,我现在删除该函数。有没有什么好的方法来创建临时/一次性功能?
s4chpxco1#
我需要知道如何在我正在写的脚本中多次使用。原来可以使用pg_temp模式创建一个临时函数。这是一个根据需要为连接创建的模式,是存储临时表的地方。当您的连接关闭或过期时,此架构将被删除。如果在这个模式上创建一个函数,这个模式将自动创建。因此
create function pg_temp.testfunc() returns text as $$ select 'hello'::text $$ language sql;
将是一个函数,只要你的连接保持不变,它就会保持不变。无需调用drop命令。
fjnneemd2#
smart trick in @crowmagnumb's answer的几个附加说明:
pg_temp
search_path
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,那么可以考虑使用prepared statement。它的行为很像一个 * 临时SQL函数 *,在会话结束时死亡。但是,这并不是同一件事,它只能单独与EXECUTE一起使用,而不能嵌套在另一个查询中。示例:
EXECUTE
PREPARE upd_tbl AS UPDATE tbl t SET set_name = $2 WHERE tbl_id = $1;
电话:
EXECUTE upd_tbl(123, 'foo_name');
详细内容:
cu6pst1q3#
如果您使用的是9.0版,则可以使用新的DO语句执行此操作:http://www.postgresql.org/docs/current/static/sql-do.html对于以前的版本,您需要创建函数,调用它,然后再次删除它。
cetgtptt4#
对于ad hock程序,cursors还不错。然而,它们对于生产使用来说效率太低。它们可以让你很容易地在数据库中的SQL结果上循环。
4条答案
按热度按时间s4chpxco1#
我需要知道如何在我正在写的脚本中多次使用。原来可以使用pg_temp模式创建一个临时函数。这是一个根据需要为连接创建的模式,是存储临时表的地方。当您的连接关闭或过期时,此架构将被删除。如果在这个模式上创建一个函数,这个模式将自动创建。因此
将是一个函数,只要你的连接保持不变,它就会保持不变。无需调用drop命令。
fjnneemd2#
smart trick in @crowmagnumb's answer的几个附加说明:
pg_temp
在search_path
中(默认情况下),according to Tom Lane也要防止木马:SET ROLE
之后的同一会话中以不同角色访问该函数。从而在非临时表上使用临时函数创建普通索引。这样的索引对所有会话都是可见的,但仍然仅对创建会话有效。查询规划器将不使用函数索引,其中表达式在查询中不重复。还是有点卑鄙。它将在会话关闭时自动删除-作为依赖对象。感觉这根本就不应该被允许。。
如果你只需要重复执行一个函数,而你所需要的只是SQL,那么可以考虑使用prepared statement。它的行为很像一个 * 临时SQL函数 *,在会话结束时死亡。但是,这并不是同一件事,它只能单独与
EXECUTE
一起使用,而不能嵌套在另一个查询中。示例:电话:
详细内容:
cu6pst1q3#
如果您使用的是9.0版,则可以使用新的DO语句执行此操作:
http://www.postgresql.org/docs/current/static/sql-do.html
对于以前的版本,您需要创建函数,调用它,然后再次删除它。
cetgtptt4#
对于ad hock程序,cursors还不错。然而,它们对于生产使用来说效率太低。
它们可以让你很容易地在数据库中的SQL结果上循环。