¿Cómo crear una function temporal en PostgreSQL?

Tengo que ejecutar un bucle en la database. Este es solo un requisito de una vez. Después de ejecutar la function, estoy abandonando la function ahora.

¿Hay algún buen enfoque para crear funciones temporales / desechables?

Necesitaba saber cómo usar mucho time en un script que estaba escribiendo. Resulta que puede crear una function temporal usando el esquema pg_temp. Este es un esquema que se crea bajo demanda para su connection y es donde se almacenan las tablas temporales. Cuando su connection se cierra o caduca, este esquema se descarta. Resulta que si crea una function en este esquema, el esquema se creará automáticamente. Por lo tanto,

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

será una function que se mantendrá mientras se mantenga la connection. No es necesario llamar a un command de soltar.

Si está utilizando la versión 9.0, puede hacer esto con la nueva statement DO:

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

Con versiones anteriores, deberá crear la function, llamarla y soltarla nuevamente.

Un par de notas adicionales al truco inteligente en la respuesta de @ crowmagnumb :

  • La function debe estar calificada para el esquema en todo momento, incluso si pg_temp está en la search_path (como lo hace de forma pnetworkingeterminada), de acuerdo con Tom Lane para evitar caballos de Troya:
 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 
  • Una function creada en el esquema temporal solo es visible dentro de la misma session (al igual que las tablas temporales). Es invisible para todas las demás sesiones (incluso para el mismo rol). Puede acceder a la function como un rol diferente en la misma session después de SET ROLE .

  • Incluso podría crear un índice funcional basado en esta function "temporal":

     CREATE INDEX foo_idx ON tbl (pg_temp.f_inc(id)); 

    De este modo, se crea un índice simple utilizando una function temporal en una tabla no temporal. Tal índice sería visible para todas las sesiones pero solo válido para la session de creación. El planificador de consultas no usará un índice funcional, donde la expresión no se repite en la consulta. Sigue siendo un sucio truco. Se eliminará automáticamente cuando se cierre la session, como un object dependiente. Se siente como que esto no debe permitirse en absoluto …


Si solo necesita ejecutar una function repetidamente y todo lo que necesita es SQL, considere una statement preparada en su lugar. Actúa de forma muy similar a una function SQL temporal que muere al final de la session. No es lo mismo , sin embargo, y solo puede usarse por sí mismo, no en el context de una consulta más grande.
Ejemplo:

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

Llamada:

 EXECUTE upd_tbl(123, 'foo_name'); 

Detalles:

  • Dividir cadena dada y preparar statement de caso

Para los procedimientos de ad hock, los cursores no son tan malos. Sin embargo, son demasiado ineficientes para el uso de productos.

Le permitirán hacer loops fácilmente en resultados sql en db.