使用plpgsql获取函数内部当前函数的名称

Dav*_*d S 10 postgresql plpgsql postgresql-9.1

无论如何,在plpgsql函数中你可以获得函数的名称吗?甚至是功能的OID?

我知道plpgsql中有一些"特殊"变量(如FOUND),但似乎没有办法解决这个问题.(虽然,如果您的函数是用C语言编写的,我已经读过了.)这并不重要,但它会使我做得更好/更不脆弱.

我正在使用PostgreSQL v.9.1.5

dva*_*kis 9

从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;
Run Code Online (Sandbox Code Playgroud)


Cra*_*ger 7

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

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

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

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


Pav*_*ule 5

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

不,如何在plpgsql函数中获取当前执行函数的名称.

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