178 votes

Comment puis-je obtenir une liste de toutes les fonctions stockées dans la base de données d'un schéma particulier dans PostgreSQL™ ?

Je veux pouvoir me connecter à une base de données PostgreSQL et trouver toutes les fonctions d'un schéma particulier.

Ma pensée était que je pourrais faire une requête à pg_catalog ou information_schema et obtenir une liste de toutes les fonctions, mais je ne peux pas comprendre où les noms et les paramètres sont stockés. Je cherche une requête qui me donnera le nom de la fonction et les types de paramètres qu'elle prend (et l'ordre dans lequel elle les prend).

Y a-t-il un moyen de le faire ?

247voto

Milen A. Radev Points 20462
\df <schema>.*

en psql donne les informations nécessaires.

Pour voir la requête utilisée en interne, connectez-vous à une base de données avec psql et fournissez une option supplémentaire "-E" (ou "--echo-hidden"), puis exécutez la commande ci-dessus.

118voto

Rudd Zwolinski Points 6852

Après quelques recherches, j'ai pu trouver le tableau information_schema.routines et les tableaux information_schema.parameters. À l'aide de ceux-ci, on peut construire une requête à cet effet. LEFT JOIN, au lieu de JOIN, est nécessaire pour récupérer des fonctions sans paramètres.

SELECT routines.routine_name, parameters.data_type, parameters.ordinal_position
FROM information_schema.routines
    LEFT JOIN information_schema.parameters ON routines.specific_name=parameters.specific_name
WHERE routines.specific_schema='my_specified_schema_name'
ORDER BY routines.routine_name, parameters.ordinal_position;

38voto

jb. Points 4932

Si quelqu'un est intéressé ici, c'est quelle requête est exécutée par psql sur postgres 9.1 :

SELECT n.nspname as "Schema",
  p.proname as "Name",
  pg_catalog.pg_get_function_result(p.oid) as "Result data type",
  pg_catalog.pg_get_function_arguments(p.oid) as "Argument data types",
 CASE
  WHEN p.proisagg THEN 'agg'
  WHEN p.proiswindow THEN 'window'
  WHEN p.prorettype = 'pg_catalog.trigger'::pg_catalog.regtype THEN 'trigger'
  ELSE 'normal'
 END as "Type"
FROM pg_catalog.pg_proc p
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE pg_catalog.pg_function_is_visible(p.oid)
      AND n.nspname <> 'pg_catalog'
      AND n.nspname <> 'information_schema'
ORDER BY 1, 2, 4;

Vous pouvez obtenir ce que psql exécute pour une commande antislash en exécutant psql avec le drapeau -E.

23voto

laudarch Points 363

Exécutez la requête SQL ci-dessous pour créer une vue qui affichera toutes les fonctions :

CREATE OR REPLACE VIEW show_functions AS
    SELECT routine_name FROM information_schema.routines 
        WHERE routine_type='FUNCTION' AND specific_schema='public';

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X