PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment obtenir des listes de paramètres de fonction (afin que je puisse supprimer une fonction)

Postgres a une fonction dédiée à cet effet. Introduit avec Postgres 8.4. Le manuel :

pg_get_function_identity_arguments(func_oid) ... obtenir la liste des arguments pour identifier une fonction (sans valeurs par défaut) ...

pg_get_function_identity_arguments renvoie l'argument listnécessaire pour identifier une fonction, sous la forme qu'il devrait apparaître dans ALTER FUNCTION , par exemple. Ce formulaire omet les valeurs par défaut.

En utilisant cela (et format() , introduit avec Postgres 9.1), la requête suivante génère des instructions DDL pour supprimer les fonctions correspondant à vos termes de recherche :

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;

Le catalogue système pg_proc modifié dans Postgres 11 . proisagg a été remplacé par prokind , de véritables procédures stockées ont été ajoutées. Vous devez vous adapter. Voir :

  • Comment supprimer toutes mes fonctions dans PostgreSQL ?

Renvoie :

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

Trouvé quatre correspondances dans l'exemple car dblink utilise des fonctions surchargées.
Exécutez DROP déclarations de manière sélective !

Alternativement , vous pouvez utiliser la conversion pratique en type d'identifiant d'objet regprocedure qui renvoie une signature de fonction complète incluant les types d'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;