2012-09-26 14 views
8

erhalten Gibt es in einer plpgsql-Funktion sowieso, dass Sie den Namen der Funktion erhalten können? Oder auch die OID der Funktion?Name der aktuellen Funktion innerhalb der Funktion mit plpgsql

Ich weiß, es gibt einige "spezielle" Variablen (wie FOUND) in plpgsql, aber es scheint keine Möglichkeit zu bekommen, dies zu bekommen. (Obwohl ich gelesen habe, wo es möglich zu sein scheint, wenn Ihre Funktion in C geschrieben ist). Es ist nicht kritisch, aber es würde etwas machen, was ich ein bisschen netter/weniger zerbrechlich mache.

Ich verwende PostgreSQL v. 9.1.5

+0

Das fühlt sich an wie eine jener Fragen, bei denen Sie auf eine Lösung für das eigentliche Problem entschieden haben, und Sie bitten um Hilfe mit dieser Lösung. Was ist der Hintergrund? Warum brauchen Sie diese Informationen? Welches Problem versuchen Sie damit zu lösen? –

+1

@CraigRinger. Du hast recht. Ich möchte nicht wirklich einen Aufsatz mit 500 Wörtern über eine Frage schreiben, der sagt, was ich tue und alle Anforderungen, Zeitpläne, vergangenen Erfahrungen usw., die in die Lösung/das Design einflossen, auf die ich mich festgelegt habe. Ich habe nur versucht, eine Frage zu einem winzigen Teil davon zu beantworten. –

+0

@DavidS Macht Sinn. 'Glück. –

Antwort

2

Für Trigger TG_NAME verwenden Sie den Namen des Abzugs zu erhalten (nicht die Trigger-Funktion) gebrannt.

Sie haben auch current_query(), um die oberste Ebene Abfrage von der Anwendung ausgeführt, die Ursache für die Ausführung Ihrer Funktion. Es zeigt Ihnen keine Zwischenfunktionen.

Sonst, nicht wirklich AFAIK und ich suchten vor einer Weile, als ich einen "aktuellen Funktionsstapel" zum Debuggen drucken wollte. Andere wissen vielleicht mehr.

AKTUALISIEREN: In Pg 9.4 und höher können Sie auch PG_CONTEXT zum Aufruf-Stack verwenden, aber nicht nur den aktuellen Funktionsnamen.

+0

Ich wusste über TG_NAME und TG_ARGV. Sie sind Teil des Grundes, dass ich dachte, dass es etwas anderes wie es für eine "normale" (d. H. Nicht-Trigger-) Funktion geben könnte. Aber ich denke, ich bin wahrscheinlich kein Glück. : \ –

+0

Lol, current_query() in einer Funktion gibt "SELECT current_query()" für mich zurück, aber das ist Greenplum, also könnte es kaputt sein. – PhilHibbs

+0

@PhilHibbs: Das ist, weil beim Absetzen der Abfrage "SELECT current_query()" dann die aktuelle Abfrage "SELECT current_query()" ist. – Matty

5

Update: Möglichkeit Call-Stack zu nehmen verfügbar ist in PostgreSQL 9,4

Nein, es gibt keinen Weg, wie Namen der aktuell ausgeführten Funktion in plpgsql Funktion zu erhalten.

Vor einigen Jahren schrieb ich Funktionen für den Zugriff auf Call-Stack - es ist Teil von orafce. Sie können letzte Funktion von Stapel erhalten

+0

Update: Möglichkeit, Call-Stack zu nehmen ist in PostgreSQL 9.4 verfügbar –

5

Ab Postgres 9.4, die unten Funktion wird seinen eigenen Namen zurück:

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; 
Verwandte Themen