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

Ana*_*and 66 sql postgresql sql-function

我必须在数据库中执行循环.这只是一次性要求.执行该函数后,我现在正在删除该函数.

有没有什么好的方法来创建临时/一次性功能?

cro*_*umb 98

我需要知道如何在我写的脚本中多次使用.事实证明,您可以使用pg_temp架构创建临时函数.这是根据您的连接需求创建的模式,也是存储临时表的位置.当您的连接关闭或过期时,将删除此架构.如果在此架构上创建函数,则会自动创建架构.因此,

create function pg_temp.testfunc() returns text as 
$$ select 'hello'::text $$ language sql;
Run Code Online (Sandbox Code Playgroud)

只要你的连接四处奔波,它就会成为一种功能.无需调用drop命令.


Erw*_*ter 52

一对夫妇的附加说明在@ crowmagnumb的回答聪明的伎俩:

  • 根据Tom Lane的说法,该函数必须始终是模式限定的,即使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
Run Code Online (Sandbox Code Playgroud)
  • 在临时模式中创建的函数仅在同一会话中可见(就像临时表一样).它对所有其他会话都是不可见的(即使是相同的角色).您可以在之后的同一会话中以不同的角色访问该功能SET ROLE.

  • 您甚至可以基于此"临时"函数创建功能索引:

    CREATE INDEX foo_idx ON tbl (pg_temp.f_inc(id));
    
    Run Code Online (Sandbox Code Playgroud)

    从而在非临时表上使用临时函数创建普通索引.这样的索引对所有会话都是可见的,但仍然只对创建会话有效.查询计划程序将不使用功能索引,其中表达式不会在查询中重复.还是有点肮脏的把戏.它会在会话关闭时自动删除 - 作为依赖对象.不应该允许这样的感觉......


如果您只需要重复执行一个函数并且只需要SQL,那么请考虑使用预准备语句.它的行为很像临时SQL函数,它在会话结束时消失.但是,不一样,它只能用于自己EXECUTE,而不能嵌套在另一个查询中.例:

PREPARE upd_tbl AS
UPDATE tbl t SET set_name = $2 WHERE tbl_id = $1;
Run Code Online (Sandbox Code Playgroud)

呼叫:

EXECUTE upd_tbl(123, 'foo_name');
Run Code Online (Sandbox Code Playgroud)

细节:


a_h*_*ame 28

如果您使用的是9.0版,则可以使用新的DO语句执行此操作:

http://www.postgresql.org/docs/current/static/sql-do.html

对于以前的版本,您需要创建函数,调用它,然后再次删除它.

  • 此外,与功能相反,`DO`语句不能有输入参数,也不能返回结果. (6认同)
  • ...它对于终端上的脚本很有用,但是你不能再次调用它,比如"anonimous function"(或lambda),所以DO语句不像"临时函数"那么有用. (3认同)
  • 如果它没有返回,我们应该称之为"功能"吗? (2认同)