2012-09-26 100 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;