Я не знаю, что вы делаете, но я уверен, что вы не делаете это хорошо :). Обычно эти странные требования связаны со странным дизайном и приводят к тому, что код трудно поддерживать.
Но вы можете легко получить oid
текущей функции с помощью PostgreSQL 9.4 и выше. (Эта информация легко доступна в функциях C PL, но она скрыта в PLpgSQL.) Гораздо проще, если ваши функции из других схем, чем public
:
CREATE OR REPLACE FUNCTION omega.inner_func()
RETURNS oid AS $$
DECLARE
stack text; fcesig text;
BEGIN
GET DIAGNOSTICS stack = PG_CONTEXT;
fcesig := substring(stack from 'function (.*?) line');
RETURN fcesig::regprocedure::oid;
END;
$$ LANGUAGE plpgsql;
Для функций из public
схемы это немного больше сложно - существует несогласованность и без явного добавления префикса «публичный» приведение к regprocedure
не должно работать, если public
не находится в search_path
. Для общего решения требуются еще несколько линий:
CREATE OR REPLACE FUNCTION omega.inner_func()
RETURNS oid AS $$
DECLARE
stack text; fcesig text; retoid oid;
BEGIN
GET DIAGNOSTICS stack = PG_CONTEXT;
fcesig := substring(stack from 'function (.*?) line');
retoid := to_regprocedure(fcesig::cstring);
IF retoid IS NOT NULL THEN RETURN retoid; END IF;
RETURN to_regprocedure(('public.' || fcesig)::cstring);
END;
$$ LANGUAGE plpgsql;
Не уверен, что у меня на голове, но ... * why *? Какую проблему вы пытаетесь решить с этим? –
В конце концов, я хочу получить имя схемы, в которой была создана функция. Мне нужно это, чтобы манипулировать 'search_path' во время выполнения. – maroonyw
Я не думаю, что это возможно. См. [Этот ответ] (http://stackoverflow.com/a/12620168/1104979) от одного из главных участников Postgres. С тех пор он добавил [поддержку дескрипторов callstack] (http://www.postgresql.org/message-id/[email protected]om), которая даст вам имя функции, но, к сожалению, она не кажется схема - квалифицировать что угодно. –