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;
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;
3条答案
按热度按时间axzmvihb1#
我猜你看起来就像
第一个月
我怀疑你能不能把它作为变量得到。你可以从
current_query()
得到函数名,但它会非常不可靠...除非你每次调用它时都把函数名定义为第一个参数:),那么你可以使用$1,但它也不太可靠...ewm0tg9j2#
我不知道你在做什么,但我肯定你做得不好:)通常,这些奇怪的需求与奇怪的设计有关,导致代码难以维护。
但是你可以使用PostgreSQL 9.4或更高版本轻松获取当前函数的
oid
。(这个信息在C PL函数中很容易获得,但它隐藏在PLpgSQL中。)如果你的函数来自其他模式而不是public
,那么就容易得多:字符串
对于来自
public
模式的函数,这有点困难-存在不一致性,并且如果没有显式地附加前缀“public”,则当public
不在search_path
中时,转换到regprocedure
不应该工作。通用解决方案需要多几行:型
nwlqm0z13#
这是一个老问题了,但是这个功能似乎已经由上面回答这个问题的同一个Pavel提交给了Postgres版本16:
在PL/pgSQL中添加获取当前函数的参数的功能(Pavel Stehule)
这是通过GET DIAGNOSTICS变量= PG_ROUTINE_DATA. https://www.postgresql.org/docs/release/16.0/完成的
下面是提交:https://www.postgresql.org/message-id/E1pjkX2-001M2a-UE%40gemulon.postgresql.org