sql >> Database >  >> RDS >> PostgreSQL

Hoe functieparameterlijsten te krijgen (zodat ik een functie kan laten vallen)

Postgres heeft daarvoor een speciale functie. Geïntroduceerd met Postgres 8.4. De handleiding:

pg_get_function_identity_arguments(func_oid) ... krijg een lijst met argumenten om een ​​functie te identificeren (zonder standaardwaarden) ...

pg_get_function_identity_arguments geeft de argumentenlijst terug die nodig is om een ​​functie te identificeren, in de vorm waarin deze zou moeten verschijnen in ALTER FUNCTION , bijvoorbeeld. Dit formulier laat standaardwaarden weg.

Dat gebruiken (en format() , geïntroduceerd met Postgres 9.1), genereert de volgende query DDL-instructies om functies te laten vallen die overeenkomen met uw zoektermen:

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;

De systeemcatalogus pg_proc gewijzigd in Postgres 11 . proisagg werd vervangen door prokind , zijn echte opgeslagen procedures toegevoegd. Je moet je aanpassen. Zie:

  • Hoe verwijder ik al mijn functies in PostgreSQL?

Retourneren:

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

Vier overeenkomsten gevonden in het voorbeeld omdat dblink overbelaste functies gebruikt.
Voer DROP uit uitspraken selectief!

Alternatief , kunt u de handige cast naar het object-ID-type regprocedure . gebruiken die een volledige functiehandtekening retourneert, inclusief argumenttypes:

-- 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. fout bij het installeren van psycopg2, bibliotheek niet gevonden voor -lssl

  2. Het dubbele aanhalingsteken weglaten om een ​​query uit te voeren op PostgreSQL

  3. Waarom bespaart SQL Server DATETIME-type tijd in tikken van 1/300 van een seconde?

  4. Haal de ID van een object uit de naam in SQL Server:OBJECT_ID()