sql >> Database teknologi >  >> RDS >> PostgreSQL

Sådan får du funktionsparameterlister (så jeg kan slippe en funktion)

Postgres har en dedikeret funktion til det formål. Introduceret med Postgres 8.4. Manualen:

pg_get_function_identity_arguments(func_oid) ... få argumentliste for at identificere en funktion (uden standardværdier) ...

pg_get_function_identity_arguments returnerer den argumentliste, der er nødvendig for at identificere en funktion, i den form, den skal optræde i ALTER FUNCTION , for eksempel. Denne formular udelader standardværdier.

Ved at bruge det (og format() , introduceret med Postgres 9.1), genererer følgende forespørgsel DDL-sætninger for at slette funktioner, der matcher dine søgetermer:

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;
 

Systemkataloget pg_proc ændret i Postgres 11 . proisagg blev erstattet af prokind , blev ægte lagrede procedurer tilføjet. Du skal tilpasse dig. Se:

  • Hvordan dropper jeg alle mine funktioner i PostgreSQL?

Returnerer:

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);

Fandt fire match i eksemplet, fordi dblink bruger overbelastede funktioner.
Kør DROP udsagn selektivt!

Alternativt , kan du bruge den praktiske cast til objektidentifikatortypen regprocedure som returnerer en komplet funktionssignatur inklusive argumenttyper:

-- 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;
 


  1. Anmodning indstillet i Concurrent Manager

  2. Rette "Konvertering mislykkedes ved konvertering af varchar-værdien" Når du prøver at sammenkæde i SQL Server

  3. Hvordan bruger man Timestamp_to_scn og Scn_to_timestamp i Oracle?

  4. Hvordan kontrollerer jeg, om en kolonne er tom eller null i MySQL?