2012-09-26 18 views
8

¿Hay alguna forma dentro de una función plpgsql de que pueda obtener el nombre de la función? O incluso el OID de la función?Obteniendo el nombre de la función actual dentro de la función con plpgsql

Sé que hay algunas variables "especiales" (como FOUND) dentro de plpgsql, pero no parece haber ninguna forma de conseguir esto. (Aunque he leído dónde parece posible si su función está escrita en C). No es crítico, pero haría algo que esté haciendo un poco más agradable/menos frágil.

estoy usando PostgreSQL v. 9.1.5

+0

Esto se siente como uno de los aspectos en que se haya decidido por una solución al problema real y estás pidiendo ayuda con esa solución. ¿Cuál es el fondo? ¿Por qué necesitas esa información? ¿Qué problema estás tratando de resolver con él? –

+1

@CraigRinger. Tienes razón. Realmente no quiero escribir un ensayo de una pregunta de 500 palabras que diga lo que estoy haciendo y todos los requisitos, líneas de tiempo, experiencias pasadas, etc. que se incluyeron en la solución/diseño en el que me he decidido. Solo estaba tratando de obtener una respuesta sobre una pequeña pieza. –

+0

@DavidS tiene sentido. 'suerte. –

Respuesta

2

Para desencadenantes utilizan TG_NAME para obtener el nombre del disparador (no la función de disparo) disparado.

También tiene current_query() para obtener la consulta de nivel superior ejecutada por la aplicación, la causa raíz para la ejecución de su función. No te mostrará ninguna función intermedia.

De lo contrario, realmente no AFAIK y yo fuimos buscando hace un tiempo cuando quería imprimir una "pila de funciones actual" para la depuración. Otros pueden saber más.

ACTUALIZACIÓN: En Pg 9.4 y superior también puede usar PG_CONTEXT en la pila de llamadas, pero no solo el nombre de la función actual.

+0

Sabía sobre TG_NAME y TG_ARGV. Son parte de la razón por la que pensé que podría haber algo más para una función "normal" (es decir, sin activación). Pero, creo que probablemente no tenga suerte. : \ –

+0

Lol, current_query() en una función devuelve "SELECT current_query()" para mí, pero esto es Greenplum por lo que podría estar roto. – PhilHibbs

+0

@PhilHibbs: eso se debe a que al emitir la consulta "SELECT current_query()", la consulta actual es "SELECT current_query()". – Matty

5

Actualización: posibilidad de tomar pila de llamadas está disponible en PostgreSQL 9,4

No, no hay manera de cómo obtener el nombre de la función actualmente ejecutada en función plpgsql.

Hace un año escribí funciones para acceder a la pila de llamadas: es parte de orafce. Puede obtener la última función de la pila

+0

Actualización: la posibilidad de tomar la pila de llamadas está disponible en PostgreSQL 9.4 –

5

A partir de Postgres 9.4, la función devolverá a continuación su propio nombre:

CREATE OR REPLACE FUNCTION your_schema.get_curr_fx_name() 
RETURNS text AS $$ 
DECLARE 
    stack text; fcesig text; 
BEGIN 
    GET DIAGNOSTICS stack = PG_CONTEXT; 
    fcesig := substring(stack from 'function (.*?) line'); 
    RETURN fcesig::regprocedure::text; 
END; 
$$ LANGUAGE plpgsql; 
Cuestiones relacionadas