2012-09-26 77 views
8

有没有办法从plpgsql函数中获得函数的名称?甚至是函数的OID?使用plpgsql获取函数内的当前函数的名称

我知道在plpgsql中有一些“特殊的”变量(如FOUND),但似乎没有任何方法可以获取此变量。 (尽管如此,如果你的函数是用C语言编写的,我已经阅读过它的地方。这并不重要,但它会让我做的更好,更脆弱。

我使用PostgreSQL诉9.1.5

+0

这感觉像这些问题之一,你已经决定在解决实际问题并且您正在寻求该解决方案的帮助。背景是什么?你为什么需要这些信息?你想用它解决什么问题? –

+1

@CraigRinger。你是对的。我真的不想写一篇500字的论文,写一个问题,说明我正在做什么,以及我已经解决的所有解决方案/设计中的所有要求,时间表,设计经验等等。我只是试图回答关于它的一小部分的问题。 –

+0

@DavidS有道理。 '运气。 –

回答

2

对于触发器使用TG_NAME得到激发触发器(未触发功能)的名称。

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

否则,不是真的AFAIK,我前一阵子想去打印一个“当前函数堆栈”进行调试。其他人可能知道更多。

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

+0

我知道TG_NAME和TG_ARGV。它们是我认为对于“正常”(即非触发)功能可能有其他类似功能的原因的一部分。但是,我想我可能不走运。 :\ –

+0

函数中的Lol,current_query()返回“SELECT current_query()”,但这是Greenplum,因此可能会被破坏。 – PhilHibbs

+0

@PhilHibbs:这是因为当发出查询“SELECT current_query()”时,那么当前查询是“SELECT current_query()”。 – Matty

5

更新:可能采取调用堆栈可以在PostgreSQL的9.4

没有,有没有办法如何让PLPGSQL功能当前执行的函数的名称。

一年前我写了访问调用堆栈的函数 - 它是orafce的一部分。您可以从堆栈

+0

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

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;