comment afficher le code de procédure stockée complet?


111

Comment afficher une procédure / fonction stockée?

Disons que j'ai une ancienne fonction sans la définition originale - je veux voir ce qu'elle fait dans pg / psql mais je n'arrive pas à trouver un moyen de le faire.

en utilisant Postgres version 8.4.1

Réponses:


19

utilisez pgAdmin ou utilisez pg_proc pour obtenir la source de vos procédures stockées. pgAdmin fait de même.


3
pg_proc c'est tout! Ouf, je suis content qu'ils aient économisé quelques octets d'espace en ne l'appelant pas pg_procedure ... geez. :)
darren

14
Il est assez facile de savoir quelles requêtes psql utilise pour récupérer ces informations (par exemple pour la commande \ df) en démarrant psql avec le paramètre --echo-hidden. Cela montrera toutes les requêtes utilisées en interne. pg_proc ne stocke pas une instruction CREATE FUNCTION complète. Vous pouvez utiliser pg_get_functiondef () pour récupérer la source complète.
a_horse_with_no_name

5
juste au cas où quelqu'un serait confus quant à l'emplacement de cette table: pg_catalog -> table système -> pg_proc
Dimitris

242

\df+ <function_name>dans psql .


6
Y a-t-il un moyen d'imprimer cela? La raison pour laquelle je pose la question est que cela le rend illisible.
12hys

3
C'est assez imprimé, pour moi. N'oubliez pas que si vous faites cela de manière interactive dans psql et que les lignes sont encapsulées et que le pager entre en action, vous pouvez alors désactiver les lignes encapsulées en tapant '-S' (identique à l'argument de ligne de commande 'less'), puis utilisez les touches fléchées pour faire défiler autour.
Jonathan Hartley

10
Pour plus de lisibilité, vous pouvez utiliser la \x méta-commande psql avant d'afficher la définition de la fonction. \xest également utile pour afficher les résultats de requêtes contenant des enregistrements avec de longues chaînes.
Ragoût

149

\ef <function_name>dans psql. Cela donnera toute la fonction avec du texte modifiable.


2
Réponse exacte. Cela ouvrira la définition de la fonction dans l'éditeur.
Ponnusamy K

2
C'est la meilleure réponse! Il montre la définition de la fonction de manière lisible.
faramka

3
N'oubliez pas de taper ; <enter>après pour exécuter le tampon.
redolent

4
ERROR: more than one function named
Brian Haak

62
SELECT prosrc FROM pg_proc WHERE proname = 'function_name';

Cela indique au gestionnaire de fonction comment appeler la fonction. Il peut s'agir du code source réel de la fonction pour les langages interprétés, d'un symbole de lien, d'un nom de fichier ou à peu près n'importe quoi d'autre, selon le langage d'implémentation / la convention d'appel


C'est utile. Existe-t-il un moyen d'imprimer correctement la sortie?
Setjmp

Ceci est utile car cela ne nécessite pas psql. Notez que les noms de fonction semblent être réduits.
Seamus Abshere le

@Maxim, savez-vous comment détecter le type de retour et les arguments d'entrée?
Fivell

@Fivell, pour seulement les noms arg, pas les types: SELECT proname, prosrc, proargnames FROM pg_proc WHERE proname like '%func_name%'. Ceci au moins sur la page 9.6. Vous pouvez obtenir le code numérique du type via la propriété proargtypes, mais vous devrez vous joindre à une autre table pour obtenir cela sous forme de noms.
Thalis K.


10

Si quelqu'un se demande comment interroger rapidement les tables du catalogue et utiliser la pg_get_functiondef()fonction, voici l'exemple de requête:

SELECT n.nspname AS schema
      ,proname AS fname
      ,proargnames AS args
      ,t.typname AS return_type
      ,d.description
      ,pg_get_functiondef(p.oid) as definition
--      ,CASE WHEN NOT p.proisagg THEN pg_get_functiondef(p.oid)
--            ELSE 'pg_get_functiondef() can''t be used with aggregate functions'
--       END as definition
  FROM pg_proc p
  JOIN pg_type t
    ON p.prorettype = t.oid
  LEFT OUTER
  JOIN pg_description d
    ON p.oid = d.objoid
  LEFT OUTER
  JOIN pg_namespace n
    ON n.oid = p.pronamespace
 WHERE NOT p.proisagg
   AND n.nspname~'<$SCHEMA_NAME_PATTERN>'
   AND proname~'<$FUNCTION_NAME_PATTERN>'

pg_get_functiondef () ne semble pas gérer les fonctions d'agrégation définies par l'utilisateur. Comme j'obtiens une ERREUR: "histogramme" est une fonction d'agrégation lorsque j'interroge un UDA
Tim Child

2
[42809] ERREUR: "array_agg" est une fonction d'agrégation
Daniel L. VanDenBosch

1
@ DanielL.VanDenBosch corrigé (pour simplement exclure les fonctions d'agrégation)
msciwoj

Vous m'avez sauvé la vie ... pg_get_functiondef () peut être utilisé pour trouver des procs avec un mot spécifique dans la définitionpg_get_functiondef(p.oid) ilike '%indicator_loss%'
Zéro

0

Vous pouvez également obtenir par phpPgAdmin si vous le configurez dans votre système,

Étape 1: Sélectionnez votre base de données

Étape 2: Cliquez sur le bouton Rechercher

Étape 3: Modifiez l'option de recherche en fonctions, puis cliquez sur Rechercher.

Vous obtiendrez la liste des fonctions définies. Vous pouvez également rechercher des fonctions par nom, en espérant que cette réponse aidera les autres.


-1

Pour voir le code complet (requête) écrit dans la procédure / les fonctions stockées, utilisez la commande ci-dessous:

sp_helptext procedure/function_name

pour le nom de la fonction et le nom de la procédure, n'ajoutez pas le préfixe «dbo». ou 'sys.'.

n'ajoutez pas de crochets à la fin de la procédure ou du nom de la fonction et ne transmettez pas non plus les paramètres.

utilisez le mot-clé sp_helptext, puis transmettez simplement le nom de la procédure / fonction.

utilisez la commande ci-dessous pour voir le code complet écrit pour la procédure:

sp_helptext ProcedureName

utilisez la commande ci-dessous pour voir le code complet écrit pour la fonction:

sp_helptext FunctionName

Il n'y sp_helptexten a pas dans postgresql.
GSerg

-2

Normalement, vous utiliseriez une application de gestion de base de données comme pgAdmin , accédez à l'objet qui vous intéresse et cliquez avec le bouton droit de la souris sur "script as create" ou similaire.

Essayez-vous de faire cela ... sans application de gestion?


2
Juste la ligne de commande - pas d'application de gestion. Si pgAdmin peut le faire, il doit utiliser une sorte de commande - je ne trouve tout simplement aucune documentation à ce sujet. Je regarde à travers les tables pg_ * mais aucune ne semble se démarquer.
darren

Heureux d'avoir trouvé une réponse, mais je ne sais pas pourquoi vous vous compliquez la vie! Pourquoi ne pas simplement installer pgAdmin?
annakata

7
Lors de la connexion à distance à une base de données dans une session ssh, il n'est pas facile d'exécuter une application de gestion.
jutky
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.