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

时间:2012-09-26 22:47:14

标签: postgresql plpgsql postgresql-9.1

在plpgsql函数中是否有可以获取函数名称?甚至是功能的OID?

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

我正在使用PostgreSQL v.9.1.5

3 个答案:

答案 0 :(得分:8)

从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;

答案 1 :(得分:5)

  

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

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

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

答案 2 :(得分:4)

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

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

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

UPDATE :在第9.4及以上版本中,您还可以使用PG_CONTEXT来调用堆栈,但不仅仅是当前的函数名称。