Получение имени текущей функции внутри функции с помощью plpgsql

В любом случае из функции plpgsql вы можете получить имя функции? Или даже OID функции?

Я знаю, что в plpgsql есть некоторые "специальные" переменные (такие как FOUND), но, похоже, нет никакого способа получить это. (Хотя я читал, где это кажется возможным, если ваша функция написана на C). Это не критично, но это сделало бы то, что я делаю, немного лучше/менее хрупким.

Я использую PostgreSQL версии 9.1.5.


person David S    schedule 26.09.2012    source источник
comment
Это похоже на одну из тех проблем, когда вы выбрали решение реальной проблемы и просите помощи в этом решении. Какой фон? Зачем вам эта информация? Какую проблему вы пытаетесь решить с его помощью?   -  person Craig Ringer    schedule 27.09.2012
comment
@КрейгРингер. Ты прав. На самом деле я не хочу писать эссе на 500 слов с вопросом, в котором говорится, что я делаю, и все требования, сроки, прошлый опыт и т. Д., Которые вошли в решение / дизайн, на котором я остановился. Я просто пытался получить ответ на вопрос об одном крошечном кусочке этого.   -  person David S    schedule 27.09.2012
comment
@CraigRinger - Спасибо и большое спасибо за ответ ниже.   -  person David S    schedule 27.09.2012


Ответы (3)


Для триггеров используйте TG_NAME, чтобы получить имя триггера (не функция триггера) сработала.

У вас также есть current_query() для получения запроса верхнего уровня, выполняемого приложением, что является основной причиной выполнения вашей функции. Он не покажет вам никаких промежуточных функций.

В противном случае, не совсем AFAIK, и я искал его некоторое время назад, когда хотел напечатать «текущий стек функций» для отладки. Другие могут знать больше.

ОБНОВЛЕНИЕ: в Pg 9.4 и выше вы также можете использовать PG_CONTEXT для стека вызовов, но не только имя текущей функции.

person Craig Ringer    schedule 27.09.2012
comment
Я знал о TG_NAME и TG_ARGV. Они являются частью причины, по которой я думал, что может быть что-то подобное для нормальной (то есть нетриггерной) функции. Но, думаю, мне, наверное, не повезло. :\ - person David S; 27.09.2012
comment
Lol, current_query() в функции возвращает SELECT current_query() для меня, но это Greenplum, так что он может быть сломан. - person PhilHibbs; 27.07.2017
comment
@PhilHibbs: это потому, что при выдаче запроса SELECT current_query() текущим запросом является SELECT current_query(). - person Matty; 23.01.2018

Начиная с Postgres 9.4, приведенная ниже функция будет возвращать собственное имя:

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;
person dvasdekis    schedule 27.01.2017
comment
Почему бы не fcesig := substring(substring(stack from 'unction (.*)') from 'function (.*?) line'); ... тогда вы получите имя функции, вызывающей get_curr_fx_name(), а это то, что вам нужно, не так ли? - person Tom Warfield; 06.02.2021
comment
... подтягивание со второй строки стека вызовов, а не с первой? - person Tom Warfield; 06.02.2021

Обновление: в PostgreSQL 9.4 появилась возможность использовать стек вызовов.

Нет, невозможно получить имя выполняемой в данный момент функции в функции plpgsql.

Несколько лет назад я написал функции для доступа к стеку вызовов — это часть orafce. Вы можете получить последнюю функцию из стека

person Pavel Stehule    schedule 27.09.2012
comment
Обновление: в PostgreSQL 9.4 появилась возможность использовать стек вызовов. - person Pavel Stehule; 23.12.2014