Wie wird die Funktion, Prozedur und der Quellcode in postgresql angezeigt?

168

Wie drucke ich Funktionen und löse Quellcode in postgresql aus? Bitte lassen Sie mich wissen, wenn jemand die Abfrage zur Anzeige der Funktion kennt und den Quellcode auslöst.

Ganesh
quelle
11
Als Hinweis für Follower, die hierher gekommen sind, um herauszufinden, wie alle Trigger aufgelistet werden sollen , ist es select * from pg_trigger;oder, wenn Sie auch sehen möchten, welche Tabelle jeder Trigger für select tgrelid::regclass, tgname from pg_trigger;FWIW `
rogerdpack

Antworten:

152

\df+in psql gibt Ihnen den Quellcode.

Mateusz Grotek
quelle
17
Schön :) Ich schlage \dfvor, den Namen Ihrer Funktion zu finden, dann \xfür die erweiterte Ausgabe, dann\df+ name_of_function
Sam Watkins
33
\ df + gibt viel mehr als den Code aus. Wenn alles, was Sie wollen, der Code ist, wird \ sf den Trick machen!
Telic
Wie sehe ich Funktionen einer installierten EXTENSION? Beispiel Ich verwende ltree , aber es gibt keine Antwort mit \df ltxtquery.
Peter Krauss
\x ONist ein Muss für transponierte Anzeige
andilabs
130

Für die Funktion:

Sie können die Ansicht pg_proc wie folgt abfragen

select proname,prosrc from pg_proc where proname= your_function_name; 

Eine andere Möglichkeit besteht darin, einfach den Befehl auszuführen \dfund \efdie Funktionen aufzulisten .

skytf=> \df           
                                             List of functions
 Schema |         Name         | Result data type |              Argument data types               |  Type  
--------+----------------------+------------------+------------------------------------------------+--------
 public | pg_buffercache_pages | SETOF record     |                                                | normal


skytf=> \ef  pg_buffercache_pages

Es wird der Quellcode der Funktion angezeigt.

Für Auslöser:

Ich weiß nicht, ob es einen direkten Weg gibt, um den Quellcode zu erhalten. Kennen Sie einfach den folgenden Weg, vielleicht hilft es Ihnen!

  • Schritt 1: Holen Sie sich die Tabelle oid des Triggers:
    skytf => wähle tgrelid aus pg_trigger aus, wobei tgname = 'insert_tbl_tmp_trigger';
      tgrelid
    ---------
       26599
    (1 Reihe)
  • Schritt 2: Holen Sie sich den Tabellennamen der obigen OID!
    skytf => wähle oid, relname aus pg_class wobei oid = 26599;
      oid | relname           
    ------- + -----------------------------
     26599 | tbl_tmp
    (1 Reihe)
  • Schritt 3: Listen Sie die Tabelleninformationen auf
    skytf => \ d tbl_tmp

Es zeigt Ihnen die Details des Auslösers der Tabelle. Normalerweise verwendet ein Trigger eine Funktion. Sie können also den Quellcode der Triggerfunktion genau wie oben beschrieben abrufen!

Franken
quelle
37

Hier einige Beispiele aus PostgreSQL-9.5

Anzeigeliste:

  1. Funktionen: \df+
  2. Löst aus : \dy+

Anzeigedefinition:

postgres=# \sf
function name is required

postgres=# \sf pg_reload_conf()
CREATE OR REPLACE FUNCTION pg_catalog.pg_reload_conf()
 RETURNS boolean
 LANGUAGE internal
 STRICT
AS $function$pg_reload_conf$function$

postgres=# \sf pg_encoding_to_char
CREATE OR REPLACE FUNCTION pg_catalog.pg_encoding_to_char(integer)
 RETURNS name
 LANGUAGE internal
 STABLE STRICT
AS $function$PG_encoding_to_char$function$
Sathish
quelle
7
Wenn Sie \xzuerst die erweiterte Anzeige aktivieren, wird auch die Lesbarkeit verbessert.
Taschen und
26

Es gibt viele Möglichkeiten. Am einfachsten ist es, einfach pgAdmin zu verwenden und dies aus dem SQL-Fenster abzurufen. Allerdings , wenn Sie programmatisch diese dann examinate erhalten möchten pg_procund pg_triggerSystemkataloge oder routinesund triggersAnsichten von Informationen Schema (das Standard Weise SQL, aber es könnte nicht decken alle Funktionen besonders PostgreSQL-spezifisch). Beispielsweise:

SELECT
    routine_definition 
FROM
    information_schema.routines 
WHERE
    specific_schema LIKE 'public'
    AND routine_name LIKE 'functionName';
Grzegorz Szpetkowski
quelle
3
Mmmm .. Ich habe PGPSQL-Funktionen, die eine leere Routine_Definition haben und im Feld Routine_Körper 'EXTERNAL' angeben. Gibt es einen Hinweis, wo ich diese finden kann?
Alfonx
2
+1 Dies ist eine Standard- / tragbare Lösung. Für Ansichten ist die SQL:SELECT view_definition FROM information_schema.views WHERE table_schema = ? AND table_name = ?
Franta
Aber was ist mit dem Fall, in dem ein Funktionsname nicht eindeutig ist, weil jemand Funktionen mit demselben Namen und unterschiedlichen Funktionsargumenten erstellt hat? stackoverflow.com/questions/47341513/…
mg1075
@alfonx siehe pgproc.prosrcSpalte
Tomáš Záluský
12

Etwas mehr als nur das Anzeigen der Funktion, wie wäre es auch mit der Funktion zum Bearbeiten an Ort und Stelle?

\ef <function_name>ist sehr praktisch. Der Quellcode der Funktion wird im bearbeitbaren Format geöffnet. Sie können es nicht nur anzeigen, sondern auch bearbeiten und ausführen.

Nur \efohne Funktionsname wird die bearbeitbare Vorlage CREATE FUNCTION geöffnet.

Zur weiteren Bezugnahme -> https://www.postgresql.org/docs/9.6/static/app-psql.html

mythischer Kodierer
quelle
11

\sf Funktionsname in psql liefert den bearbeitbaren Quellcode einer einzelnen Funktion.

Von https://www.postgresql.org/docs/9.6/static/app-psql.html :

\ sf [+] function_description Dieser Befehl ruft die Definition der benannten Funktion ab und zeigt sie in Form eines Befehls CREATE OR REPLACE FUNCTION an.

Wenn + an den Befehlsnamen angehängt wird, werden die Ausgabezeilen nummeriert, wobei die erste Zeile des Funktionskörpers Zeile 1 ist.

Sergey Tarasov
quelle
zeigt den Quellcode einer Funktion. Der Funktionsname \ ef öffnet es in einem bearbeitbaren Templet
amar
0

Seit Version: psql (9.6.17, Server 11.6)

Ich habe alle oben genannten Antworten außer für mich versucht

postgres=> \sf jsonb_extract_path_text
CREATE OR REPLACE FUNCTION pg_catalog.jsonb_extract_path_text(from_json jsonb, VARIADIC path_elems text[])
 RETURNS text
 LANGUAGE internal
 IMMUTABLE PARALLEL SAFE STRICT
AS $function$jsonb_extract_path_text$function$



postgres=> \df+
ERROR:  column p.proisagg does not exist
LINE 6:   WHEN p.proisagg THEN 'agg'
               ^
HINT:  Perhaps you meant to reference the column "p.prolang".

df scheint bei mir nicht zu funktionieren.

Ravi Parekh
quelle