sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man får funktionsparameterlistor (så att jag kan släppa en funktion)

Postgres har en dedikerad funktion för detta ändamål. Introducerad med Postgres 8.4. Manualen:

pg_get_function_identity_arguments(func_oid) ... hämta argumentlista för att identifiera en funktion (utan standardvärden) ...

pg_get_function_identity_arguments returnerar den argumentlista som är nödvändig för att identifiera en funktion, i den form som den skulle behöva visas i ALTER FUNCTION , till exempel. Detta formulär utelämnar standardvärden.

Använder det (och format() , introducerad med Postgres 9.1), genererar följande fråga DDL-satser för att ta bort funktioner som matchar dina söktermer:

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;

Systemkatalogen pg_proc ändrades i Postgres 11 . proisagg ersattes av prokind , sanna lagrade procedurer lades till. Du måste anpassa dig. Se:

  • Hur släpper jag alla mina funktioner i PostgreSQL?

Returnerar:

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

Hittade fyra matchningar i exemplet eftersom dblink använder överbelastade funktioner.
Kör DROP uttalanden selektivt!

Alternativt , kan du använda den bekväma casten till objektidentifieraren typ regprocedure som returnerar en komplett 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. Hur man hittar en databas ANSI_NULLS-inställning i SQL Server (T-SQL)

  2. Handledning för PL/SQL:Allt du behöver veta om PL/SQL

  3. Prestanda överraskningar och antaganden:Godtycklig TOPP 1

  4. En översikt över PostgreSQL Query Caching &Load Balancing