sql >> Databáze >  >> RDS >> PostgreSQL

Jak získat seznamy parametrů funkcí (abych mohl funkci vypustit)

Postgres má pro tento účel vyhrazenou funkci. Představeno s Postgres 8.4. Manuál:

pg_get_function_identity_arguments(func_oid) ... získat seznam argumentů k identifikaci funkce (bez výchozích hodnot) ...

pg_get_function_identity_arguments vrátí seznam argumentů nezbytný k identifikaci funkce ve tvaru, který by se měl objevit v rámci ALTER FUNCTION , například. Tento formulář vynechává výchozí hodnoty.

Pomocí toho (a format() , představený v Postgres 9.1), následující dotaz generuje příkazy DDL, aby odstranil funkce odpovídající vašim hledaným výrazům:

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;

Systémový katalog pg_proc změněno v Postgres 11 . proisagg bylo nahrazeno prokind byly přidány skutečné uložené procedury. Je potřeba se přizpůsobit. Viz:

  • Jak zrušit všechny mé funkce v PostgreSQL?

Vrátí:

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

V příkladu byly nalezeny čtyři shody, protože dblink používá přetížené funkce.
Spustit DROP prohlášení selektivně!

Alternativně , můžete použít pohodlné přetypování na typ identifikátoru objektu regprocedure který vrátí úplný podpis funkce včetně typů argumentů:

-- 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. Jak získat věk z pole D.O.B v MySQL?

  2. Vývojářský nástroj Oracle SQL:Stažení a instalace

  3. Převést „datetime2“ na „datetimeoffset“ v SQL Server (příklady T-SQL)

  4. Jak vytvořit více jeden k jednomu