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

zlhcx6iw  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(4)|浏览(231)

我必须在数据库中执行一个循环。这只是一次性的要求。执行完函数后,我现在删除该函数。
有没有什么好的方法来创建临时/一次性功能?

s4chpxco

s4chpxco1#

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

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

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

fjnneemd

fjnneemd2#

smart trick in @crowmagnumb's answer的几个附加说明

  • 函数必须始终schema-qualified,即使pg_tempsearch_path中(默认情况下),according to 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之后的同一会话中以不同角色访问该函数。
  • 你甚至可以基于这个“temp”函数创建一个函数索引:
CREATE INDEX foo_idx ON tbl (pg_temp.f_inc(id));

从而在非临时表上使用临时函数创建普通索引。这样的索引对所有会话都是可见的,但仍然仅对创建会话有效。查询规划器将不使用函数索引,其中表达式在查询中不重复。还是有点卑鄙。它将在会话关闭时自动删除-作为依赖对象。感觉这根本就不应该被允许。。
如果你只需要重复执行一个函数,而你所需要的只是SQL,那么可以考虑使用prepared statement。它的行为很像一个 * 临时SQL函数 *,在会话结束时死亡。但是,这并不是同一件事,它只能单独与EXECUTE一起使用,而不能嵌套在另一个查询中。示例:

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

电话:

EXECUTE upd_tbl(123, 'foo_name');

详细内容:

  • 拆分给定字符串并准备case语句
cu6pst1q

cu6pst1q3#

如果您使用的是9.0版,则可以使用新的DO语句执行此操作:
http://www.postgresql.org/docs/current/static/sql-do.html
对于以前的版本,您需要创建函数,调用它,然后再次删除它。

cetgtptt

cetgtptt4#

对于ad hock程序,cursors还不错。然而,它们对于生产使用来说效率太低。
它们可以让你很容易地在数据库中的SQL结果上循环。

相关问题