PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So erhalten Sie Funktionsparameterlisten (damit ich eine Funktion löschen kann)

Postgres hat zu diesem Zweck eine spezielle Funktion. Eingeführt mit Postgres 8.4. Das Handbuch:

pg_get_function_identity_arguments(func_oid) ... Argumentliste abrufen, um eine Funktion zu identifizieren (ohne Standardwerte) ...

pg_get_function_identity_arguments gibt die zur Identifizierung einer Funktion erforderliche Argumentliste in der Form zurück, in der sie innerhalb von ALTER FUNCTION erscheinen müsste , zum Beispiel. Dieses Formular lässt Standardwerte weg.

Verwenden Sie das (und format() , eingeführt mit Postgres 9.1), generiert die folgende Abfrage DDL-Anweisungen, um Funktionen zu löschen, die Ihren Suchbegriffen entsprechen:

SELECT format('DROP %s %I.%I(%s);'
            , CASE WHEN p.proisagg THEN 'AGGREGATE' ELSE 'FUNCTION' END
            , n.nspname
            , p.proname
            , pg_catalog.pg_get_function_identity_arguments(p.oid)
             ) AS stmt
FROM   pg_catalog.pg_proc p
JOIN   pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE  p.proname = 'dblink'                     -- function name
-- AND n.nspname = 'public'                     -- schema name (optional)
-- AND pg_catalog.pg_function_is_visible(p.oid) -- function visible to user
ORDER  BY 1;

Der Systemkatalog pg_proc in Postgres 11 geändert . proisagg wurde durch prokind ersetzt , echte gespeicherte Prozeduren wurden hinzugefügt. Sie müssen sich anpassen. Siehe:

  • Wie lösche ich alle meine Funktionen in PostgreSQL?

Rückgabe:

                  stmt
---------------------------------------------------
 DROP FUNCTION public.dblink(text);
 DROP FUNCTION public.dblink(text, boolean);
 DROP FUNCTION public.dblink(text, text);
 DROP FUNCTION public.dblink(text, text, boolean); 

Im Beispiel wurden vier Übereinstimmungen gefunden, da dblink überladene Funktionen verwendet.
Führen Sie DROP aus Aussagen selektiv!

Alternativ , können Sie die bequeme Umwandlung in den Objektbezeichnertyp regprocedure verwenden die eine vollständige Funktionssignatur einschließlich Argumenttypen zurückgibt:

-- SET LOCAL search_path = '';  -- optional, to get all names schema-qualified
SELECT format('DROP %s %s;'
            , CASE WHEN proisagg THEN 'AGGREGATE' ELSE 'FUNCTION' END
            , oid::regprocedure
             ) AS stmt
FROM   pg_catalog.pg_proc
WHERE  proname = 'dblink'   -- function name
ORDER  BY 1;