无论如何,您可以从 plpgsql 函数中获取函数的名称吗?甚至是函数的 OID?
我知道 plpgsql 中有一些“特殊”变量(例如 FOUND),但似乎没有任何方法可以得到它。(虽然,如果你的函数是用 C 语言编写的,我已经读过似乎有可能的地方)。这并不重要,但它会使我正在做的事情变得更好/不那么脆弱。
我正在使用 PostgreSQL v. 9.1.5
无论如何,您可以从 plpgsql 函数中获取函数的名称吗?甚至是函数的 OID?
我知道 plpgsql 中有一些“特殊”变量(例如 FOUND),但似乎没有任何方法可以得到它。(虽然,如果你的函数是用 C 语言编写的,我已经读过似乎有可能的地方)。这并不重要,但它会使我正在做的事情变得更好/不那么脆弱。
我正在使用 PostgreSQL v. 9.1.5
从 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;
对于触发器,使用TG_NAME来获取触发的触发器(不是触发器函数)的名称。
您还必须current_query()
获取应用程序执行的顶级查询,这是函数执行的根本原因。它不会显示任何中间函数。
否则,不是真正的 AFAIK,我确实在前一段时间想打印“当前函数堆栈”以进行调试时去寻找它。其他人可能知道更多。
更新:在 Pg 9.4 及更高版本中,您还可以使用PG_CONTEXT
调用堆栈,而不仅仅是当前函数名称。
更新:PostgreSQL 9.4 中提供了调用堆栈的可能性
不,无法在 plpgsql 函数中获取当前执行的函数的名称。
几年前,我编写了访问调用堆栈的函数——它是 orafce 的一部分。您可以从堆栈中获取最后一个函数