【问题标题】:Getting name of the current function inside of the function with plpgsql使用 plpgsql 在函数内部获取当前函数的名称
【发布时间】:2012-09-18 15:52:27
【问题描述】:

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

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

我正在使用 PostgreSQL v. 9.1.5

【问题讨论】:

  • 这感觉就像您已经决定解决实际问题的问题之一,并且您正在寻求有关该解决方案的帮助。背景是什么?为什么需要这些信息?你想用它解决什么问题?
  • @CraigRinger。你说得对。我真的不想写一篇 500 字的问题文章,说明我在做什么以及我已经确定的解决方案/设计中的所有要求、时间表、过去的经验等。我只是想回答一个关于其中一小部分的问题。
  • @CraigRinger - 谢谢,非常感谢下面的回答。

标签: postgresql plpgsql postgresql-9.1


【解决方案1】:

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

【讨论】:

  • 为什么不fcesig := substring(substring(stack from 'unction (.*)') from 'function (.*?) line'); ...然后你会得到调用get_curr_fx_name()的函数的名称,这就是你想要的,不是吗?
  • ...从调用堆栈的第二行而不是第一行拉取?
【解决方案2】:

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

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

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

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

【讨论】:

  • 我知道 TG_NAME 和 TG_ARGV。它们是我认为“正常”(即非触发)功能可能还有其他类似功能的部分原因。但是,我想我可能不走运。 :\
  • 大声笑,函数中的 current_query() 为我返回“SELECT current_query()”,但这是 Greenplum,所以它可能会损坏。
  • @PhilHibbs:这是因为当发出查询“SELECT current_query()”时,当前查询是“SELECT current_query()”。
【解决方案3】:

更新:在 PostgreSQL 9.4 中可以使用调用堆栈

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

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

【讨论】:

  • 更新:在 PostgreSQL 9.4 中可以使用调用堆栈
猜你喜欢
  • 2014-01-15
  • 2016-01-14
  • 2011-04-17
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 2020-01-11
相关资源
最近更新 更多