Wie zeige ich den vollständigen Code für gespeicherte Prozeduren an?

111

Wie sehen Sie eine gespeicherte Prozedur / Funktion?

Angenommen, ich habe eine alte Funktion ohne die ursprüngliche Definition - ich möchte sehen, was sie in pg / psql tut, aber ich kann anscheinend keinen Weg finden, dies zu tun.

mit Postgres Version 8.4.1

Darren
quelle

Antworten:

19

Verwenden Sie pgAdmin oder pg_proc , um die Quelle Ihrer gespeicherten Prozeduren abzurufen . pgAdmin macht dasselbe.

Frank Heikens
quelle
3
pg_proc das wars! Puh, ich bin froh, dass sie ein paar Bytes Speicherplatz gespart haben, indem sie es nicht pg_procedure genannt haben ... meine Güte. :)
Darren
14
Es ist ziemlich einfach herauszufinden, welche Abfragen psql verwendet, um diese Informationen abzurufen (z. B. für den Befehl \ df), indem psql mit dem Parameter --echo-hidden gestartet wird. Das zeigt alle Abfragen, die intern verwendet werden. pg_proc speichert keine vollständige CREATE FUNCTION-Anweisung. Sie können pg_get_functiondef () verwenden, um die vollständige Quelle abzurufen.
a_horse_with_no_name
5
Nur für den Fall, dass jemand verwirrt ist, wo sich diese Tabelle befindet: pg_catalog -> Systemtabelle
Dimitris
242

\df+ <function_name>in psql .

Milen A. Radev
quelle
6
Gibt es eine Möglichkeit, dies hübsch zu drucken? Der Grund, den ich frage, ist, dass dies es unlesbar macht.
12hys
3
Das ist für mich ziemlich gedruckt. Denken Sie daran, wenn Sie dies interaktiv in psql tun und Zeilen umbrochen werden und der Pager aktiviert wird, können Sie umbrochene Zeilen durch Eingabe von '-S' (wie 'weniger' Befehlszeilenargument) ausschalten und dann mit den Pfeiltasten scrollen um.
Jonathan Hartley
10
Zur besseren Lesbarkeit können Sie den \x Metabefehl psql verwenden, bevor Sie die Funktionsdefinition anzeigen.\xist auch nützlich, um Abfrageergebnisse anzuzeigen, die Datensätze mit langen Zeichenfolgen enthalten.
Stew
149

\ef <function_name>in psql. Es gibt die gesamte Funktion mit bearbeitbarem Text.

Asha Koshti
quelle
2
Genaue Antwort. Dadurch wird die Funktionsdefinition im Editor geöffnet.
Ponnusamy K
2
Das ist die beste Antwort! Es zeigt die Funktionsdefinition lesbar.
Faramka
3
Vergessen Sie nicht, ; <enter>nachher einzugeben, um den Puffer auszuführen.
duftend
4
ERROR: more than one function named
Brian Haak
59
SELECT prosrc FROM pg_proc WHERE proname = 'function_name';

Dies teilt dem Funktionshandler mit, wie die Funktion aufgerufen werden soll. Je nach Implementierungssprache / Aufrufkonvention kann dies der eigentliche Quellcode der Funktion für interpretierte Sprachen, ein Verknüpfungssymbol, ein Dateiname oder fast alles andere sein

Maxime
quelle
Das ist nützlich. Gibt es eine Möglichkeit, die Ausgabe hübsch zu drucken?
Setjmp
Dies ist nützlich, da es nicht erforderlich ist psql. Beachten Sie, dass Funktionsnamen scheinbar in Großbuchstaben geschrieben sind.
Seamus Abshere
@ Maxim, wissen Sie, wie man Rückgabetyp und Eingabeargumente erkennt?
Fivell
@Fivell, nur für Arg-Namen, nicht für Typen : SELECT proname, prosrc, proargnames FROM pg_proc WHERE proname like '%func_name%'. Dies zumindest auf Seite 9.6. Sie können den numerischen Code des Typs über die Eigenschaft proargtypesabrufen, müssen ihn jedoch mit einer anderen Tabelle verknüpfen, um diesen als Namen zu erhalten.
Thalis K.
16

Verwenden Sie \dfdiese Option, um alle gespeicherten Prozeduren in Postgres aufzulisten.

Puneet Purohit
quelle
10

Wenn sich jemand fragt, wie man Katalogtabellen schnell abfragt und die pg_get_functiondef()Funktion nutzt, ist hier die Beispielabfrage:

SELECT n.nspname AS schema
      ,proname AS fname
      ,proargnames AS args
      ,t.typname AS return_type
      ,d.description
      ,pg_get_functiondef(p.oid) as definition
--      ,CASE WHEN NOT p.proisagg THEN pg_get_functiondef(p.oid)
--            ELSE 'pg_get_functiondef() can''t be used with aggregate functions'
--       END as definition
  FROM pg_proc p
  JOIN pg_type t
    ON p.prorettype = t.oid
  LEFT OUTER
  JOIN pg_description d
    ON p.oid = d.objoid
  LEFT OUTER
  JOIN pg_namespace n
    ON n.oid = p.pronamespace
 WHERE NOT p.proisagg
   AND n.nspname~'<$SCHEMA_NAME_PATTERN>'
   AND proname~'<$FUNCTION_NAME_PATTERN>'
msciwoj
quelle
pg_get_functiondef () scheint keine benutzerdefinierten Aggregatfunktionen zu verarbeiten. Wie ich ERROR bekomme: "Histogramm" ist eine Aggregatfunktion, wenn ich eine UDA
Tim Child
2
[42809] FEHLER: "array_agg" ist eine Aggregatfunktion
Daniel L. VanDenBosch
1
@ DanielL.VanDenBosch korrigiert (um Aggregatfunktionen einfach auszuschließen)
msciwoj
Du hast mein Leben gerettet ... pg_get_functiondef () kann verwendet werden, um Prozesse mit einem bestimmten Wort in der Definition zu findenpg_get_functiondef(p.oid) ilike '%indicator_loss%'
Zero
0

Sie können auch über phpPgAdmin abrufen, wenn Sie es in Ihrem System konfiguriert haben.

Schritt 1: Wählen Sie Ihre Datenbank aus

Schritt 2: Klicken Sie auf die Schaltfläche Suchen

Schritt 3: Ändern Sie die Suchoption in Funktionen und klicken Sie dann auf Suchen.

Sie erhalten die Liste der definierten Funktionen. Sie können Funktionen auch nach Namen suchen, hoffen, dass diese Antwort anderen hilft.

Veeresh Digasangi
quelle
-1

Verwenden Sie den folgenden Befehl, um den vollständigen Code (Abfrage) anzuzeigen, der in gespeicherte Prozeduren / Funktionen geschrieben wurde:

sp_helptext procedure/function_name

Fügen Sie für den Funktionsnamen und den Prozedurnamen nicht das Präfix 'dbo' hinzu. oder 'sys.'.

Fügen Sie am Ende der Prozedur oder des Funktionsnamens keine Klammern hinzu und übergeben Sie auch nicht die Parameter.

Verwenden Sie das Schlüsselwort sp_helptext und übergeben Sie dann einfach den Prozedur- / Funktionsnamen.

Verwenden Sie den folgenden Befehl, um den vollständigen Code für die Prozedur anzuzeigen:

sp_helptext ProcedureName

Verwenden Sie den folgenden Befehl, um den vollständigen Code für die Funktion anzuzeigen:

sp_helptext FunctionName
Developer_Suraj
quelle
Es gibt keine sp_helptextin postgresql.
GSerg
-2

Normalerweise verwenden Sie eine DB-Manager-Anwendung wie pgAdmin , zu dem Objekt, an dem Sie interessiert sind, und klicken mit der rechten auf "Skript als erstellen" oder ähnliches.

Versuchen Sie dies zu tun ... ohne eine Management-App?

Annakata
quelle
2
Nur die Kommandozeile - keine Management-App. Wenn pgAdmin das kann, muss es einen Befehl verwenden - ich kann einfach keine Dokumentation darüber finden. Ich schaue durch die pg_ * -Tabellen, aber keine scheint aufzufallen.
Darren
Ich bin froh, dass du eine Antwort gefunden hast, aber nicht sicher, warum du dir das Leben schwer machst! Warum nicht einfach pgAdmin installieren?
Annakata
7
Wenn Sie in einer SSH-Sitzung eine Remoteverbindung zu einer Datenbank herstellen, ist es nicht einfach, eine Verwaltungs-App auszuführen.
Jutky