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

Come ottenere elenchi di parametri di funzione (così posso eliminare una funzione)

Postgres ha una funzione dedicata a tale scopo. Introdotto con Postgres 8.4. Il manuale:

pg_get_function_identity_arguments(func_oid) ... ottieni l'elenco degli argomenti per identificare una funzione (senza valori predefiniti) ...

pg_get_function_identity_arguments restituisce l'argomento listnecessario per identificare una funzione, nella forma in cui dovrebbe apparire all'interno di ALTER FUNCTION , per esempio. Questo modulo omette i valori predefiniti.

Usando quello (e format() , introdotta con Postgres 9.1), la query seguente genera istruzioni DDL per eliminare le funzioni che corrispondono ai termini di ricerca:

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;

Il catalogo di sistema pg_proc modificato in Postgres 11 . proisagg è stato sostituito da prokind , sono state aggiunte vere stored procedure. Devi adattarti. Vedi:

  • Come eliminare tutte le mie funzioni in PostgreSQL?

Resi:

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

Trovate quattro corrispondenze nell'esempio perché dblink usa funzioni sovraccaricate.
Esegui DROP dichiarazioni in modo selettivo!

In alternativa , puoi utilizzare il comodo cast al tipo di identificatore oggetto regprocedure che restituisce una firma di funzione completa che include i tipi di argomento:

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