13

无论如何,您可以从 plpgsql 函数中获取函数的名称吗?甚至是函数的 OID?

我知道 plpgsql 中有一些“特殊”变量(例如 FOUND),但似乎没有任何方法可以得到它。(虽然,如果你的函数是用 C 语言编写的,我已经读过似乎有可能的地方)。这并不重要,但它会使我正在做的事情变得更好/不那么脆弱。

我正在使用 PostgreSQL v. 9.1.5

4

3 回答 3

13

从 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;
于 2017-01-27T08:03:38.927 回答
7

对于触发器,使用TG_NAME来获取触发的触发器(不是触发器函数)的名称。

您还必须current_query()获取应用程序执行的顶级查询,这是函数执行的根本原因。它不会显示任何中间函数。

否则,不是真正的 AFAIK,我确实在前一段时间想打印“当前函数堆栈”以进行调试时去寻找它。其他人可能知道更多。

更新:在 Pg 9.4 及更高版本中,您还可以使用PG_CONTEXT调用堆栈,而不仅仅是当前函数名称。

于 2012-09-27T00:04:48.163 回答
6

更新:PostgreSQL 9.4 中提供了调用堆栈的可能性

不,无法在 plpgsql 函数中获取当前执行的函数的名称。

几年前,我编写了访问调用堆栈的函数——它是 orafce 的一部分。您可以从堆栈中获取最后一个函数

于 2012-09-27T11:20:00.300 回答