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;