Frage Wie kann ich eine Liste aller Funktionen erhalten, die in der Datenbank eines bestimmten Schemas in PostgreSQL gespeichert sind?


Ich möchte in der Lage sein, eine Verbindung zu einer PostgreSQL-Datenbank herzustellen und alle Funktionen für ein bestimmtes Schema zu finden.

Mein Gedanke war, dass ich eine Abfrage an pg_catalog oder information_schema machen könnte und eine Liste aller Funktionen bekommen könnte, aber ich kann nicht herausfinden, wo die Namen und Parameter gespeichert sind. Ich suche nach einer Abfrage, die mir den Funktionsnamen und die Parametertypen gibt, die er benötigt (und in welcher Reihenfolge er sie annimmt).

Gibt es eine Möglichkeit, dies zu tun?


75
2017-08-28 14:17


Ursprung


Antworten:


\df <schema>.*

im psql gibt die notwendigen Informationen.

Um zu sehen, dass die intern verwendete Abfrage eine Verbindung mit einer Datenbank herstellt psql und ein Extra liefern "-E" (oder "--echo-hidden") Option und dann den obigen Befehl ausführen.


108
2017-08-28 16:27



Nach einigem Suchen konnte ich das finden information_schema.routines Tisch und die information_schema.parameters Tabellen. Mit diesen kann man eine Abfrage für diesen Zweck erstellen. LEFT JOIN anstelle von JOIN ist notwendig, um Funktionen ohne Parameter zu erhalten.

SELECT routines.routine_name, parameters.data_type, parameters.ordinal_position
FROM information_schema.routines
    LEFT JOIN information_schema.parameters ON routines.specific_name=parameters.specific_name
WHERE routines.specific_schema='my_specified_schema_name'
ORDER BY routines.routine_name, parameters.ordinal_position;

55
2017-08-28 15:11



Wenn jemand hier interessiert ist, wird welche Abfrage von ausgeführt psql auf postgres 9.1:

SELECT n.nspname as "Schema",
  p.proname as "Name",
  pg_catalog.pg_get_function_result(p.oid) as "Result data type",
  pg_catalog.pg_get_function_arguments(p.oid) as "Argument data types",
 CASE
  WHEN p.proisagg THEN 'agg'
  WHEN p.proiswindow THEN 'window'
  WHEN p.prorettype = 'pg_catalog.trigger'::pg_catalog.regtype THEN 'trigger'
  ELSE 'normal'
 END as "Type"
FROM pg_catalog.pg_proc p
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE pg_catalog.pg_function_is_visible(p.oid)
      AND n.nspname <> 'pg_catalog'
      AND n.nspname <> 'information_schema'
ORDER BY 1, 2, 4;

Sie können was bekommen psql Wird für einen Backslash-Befehl ausgeführt, indem Sie ausgeführt werden psql mit dem -E Flagge.


22
2017-12-12 17:18



Es gibt eine praktische Funktion, oidvectortypesdas macht das viel einfacher.

SELECT format('%I.%I(%s)', ns.nspname, p.proname, oidvectortypes(p.proargtypes)) 
FROM pg_proc p INNER JOIN pg_namespace ns ON (p.pronamespace = ns.oid)
WHERE ns.nspname = 'my_namespace';

Kredit an Leo Hsu und Regina Obe bei Postgres Online zum Aufzeigen oidvectortypes. Ich habe zuvor ähnliche Funktionen geschrieben, aber komplexe verschachtelte Ausdrücke verwendet, für die diese Funktion nicht mehr benötigt wird.

Siehe zugehörige Antwort.


(bearbeiten Sie 2016)

Typische Berichtsoptionen zusammenfassen:

-- Compact:
SELECT format('%I.%I(%s)', ns.nspname, p.proname, oidvectortypes(p.proargtypes))

-- With result data type: 
SELECT format(
       '%I.%I(%s)=%s', 
       ns.nspname, p.proname, oidvectortypes(p.proargtypes),
       pg_get_function_result(p.oid)
)

-- With complete argument description: 
SELECT format('%I.%I(%s)', ns.nspname, p.proname, pg_get_function_arguments(p.oid))

-- ... and mixing it.

-- All with the same FROM clause:
FROM pg_proc p INNER JOIN pg_namespace ns ON (p.pronamespace = ns.oid)
WHERE ns.nspname = 'my_namespace';

BEACHTEN: benutzen p.proname||'_'||p.oid AS specific_name  um eindeutige Namen zu erhalten oder mit JOIN zu verbinden information_schema Tabellen - siehe routines und parameters bei @ RuddZwolinski's Antwort.


Die Funktionen OID (sehenpg_catalog.pg_proc) und die Funktion spezifischer_name (seheninformation_schema.routines) sind die wichtigsten Referenzoptionen für Funktionen. Unten finden Sie einige nützliche Funktionen in Berichten und anderen Kontexten.

--- --- --- --- ---
--- Useful overloads: 

CREATE FUNCTION oidvectortypes(p_oid int) RETURNS text AS $$
    SELECT oidvectortypes(proargtypes) FROM pg_proc WHERE oid=$1;
$$ LANGUAGE SQL IMMUTABLE;

CREATE FUNCTION oidvectortypes(p_specific_name text) RETURNS text AS $$
    -- Extract OID from specific_name and use it in oidvectortypes(oid).
    SELECT oidvectortypes(proargtypes) 
    FROM pg_proc WHERE oid=regexp_replace($1, '^.+?([^_]+)$', '\1')::int;
$$ LANGUAGE SQL IMMUTABLE;

CREATE FUNCTION pg_get_function_arguments(p_specific_name text) RETURNS text AS $$
    -- Extract OID from specific_name and use it in pg_get_function_arguments.
    SELECT pg_get_function_arguments(regexp_replace($1, '^.+?([^_]+)$', '\1')::int)
$$ LANGUAGE SQL IMMUTABLE;

--- --- --- --- ---
--- User customization: 

CREATE FUNCTION pg_get_function_arguments2(p_specific_name text) RETURNS text AS $$
    -- Example of "special layout" version.
    SELECT trim(array_agg( op||'-'||dt )::text,'{}') 
    FROM (
        SELECT data_type::text as dt, ordinal_position as op
        FROM information_schema.parameters 
        WHERE specific_name = p_specific_name 
        ORDER BY ordinal_position
    ) t
$$ LANGUAGE SQL IMMUTABLE;

18
2018-06-04 10:08



Führen Sie die SQL-Abfrage aus, um eine Ansicht zu erstellen, in der alle Funktionen angezeigt werden:

CREATE OR REPLACE VIEW show_functions AS
    SELECT routine_name FROM information_schema.routines 
        WHERE routine_type='FUNCTION' AND specific_schema='public';

11
2018-05-28 18:48



Ist eine gute Idee benannt die Funktionen mit commun alias auf den ersten Wörtern für filtre den Namen mit LIKE Beispiel mit öffentlichen Schema in Postgresql 9.4, sicher sein, mit seinem Schema zu ersetzen

SELECT routine_name FROM information_schema.routines WHERE routine_type='FUNCTION' AND specific_schema='public' AND routine_name LIKE 'aliasmyfunctions%';

6
2017-12-23 10:03



Beispiel:

perfdb-# \df information_schema.*;

List of functions
        Schema      |        Name        | Result data type | Argument data types |  Type  
 information_schema | _pg_char_max_length   | integer | typid oid, typmod integer | normal
 information_schema | _pg_char_octet_length | integer | typid oid, typmod integer | normal
 information_schema | _pg_datetime_precision| integer | typid oid, typmod integer | normal
 .....
 information_schema | _pg_numeric_scale     | integer | typid oid, typmod integer | normal
 information_schema | _pg_truetypid         | oid     | pg_attribute, pg_type     | normal
 information_schema | _pg_truetypmod        | integer | pg_attribute, pg_type     | normal
(11 rows)

3
2017-09-24 11:58