¿Cómo mostrar el código de procedimiento almacenado completo?

111

¿Cómo ve un procedimiento / función almacenados?

Digamos que tengo una función antigua sin la definición original; quiero ver qué está haciendo en pg / psql pero parece que no puedo encontrar la manera de hacerlo.

usando Postgres versión 8.4.1

darren
fuente

Respuestas:

19

use pgAdmin o use pg_proc para obtener la fuente de sus procedimientos almacenados. pgAdmin hace lo mismo.

Frank Heikens
fuente
3
pg_proc ¡eso es! Menos mal que me alegro de que hayan ahorrado algunos bytes de espacio al no llamarlo pg_procedure ... caray. :)
darren
14
Es bastante fácil averiguar qué consultas está usando psql para recuperar esa información (por ejemplo, para el comando \ df) iniciando psql con el parámetro --echo-hidden. Eso mostrará todas las consultas que se utilizan internamente. pg_proc no almacena una instrucción CREATE FUNCTION completa. Puede usar pg_get_functiondef () para recuperar la fuente completa.
a_horse_with_no_name
5
en caso de que alguien esté confundido en cuanto a dónde está esa tabla: pg_catalog -> tabla del sistema -> pg_proc
Dimitris
242

\df+ <function_name>en psql .

Milen A. Radev
fuente
6
¿Hay alguna forma de imprimir esto de forma bonita? La razón por la que pregunto es porque esto lo hace ilegible.
12hys
3
Esto está bastante impreso, para mí. Recuerde que si está haciendo esto de forma interactiva en psql y las líneas se ajustan y el buscapersonas se activa, puede desactivar las líneas ajustadas escribiendo '-S' (igual que 'menos' en la línea de comando arg), luego use las teclas de flecha para desplazarse alrededor.
Jonathan Hartley
10
Para mayor legibilidad, puede usar el \x metacomando psql antes de mostrar la definición de la función. \xtambién es útil para ver resultados de consultas que contienen registros con cadenas largas.
Guiso
149

\ef <function_name>en psql. Dará toda la función con texto editable.

Asha Koshti
fuente
2
Respuesta exacta. Esto abrirá la definición de la función en el editor.
Ponnusamy K
2
¡Esta es la mejor respuesta! Muestra la definición de la función de forma legible.
faramka
3
No olvide escribir ; <enter>after para ejecutar el búfer.
oloroso
4
ERROR: more than one function named
Brian Haak
59
SELECT prosrc FROM pg_proc WHERE proname = 'function_name';

Esto le dice al controlador de la función cómo invocar la función. Puede ser el código fuente real de la función para los idiomas interpretados, un símbolo de enlace, un nombre de archivo o casi cualquier otra cosa, dependiendo del idioma de implementación / convención de llamada

Máxima
fuente
Esto es útil. ¿Hay alguna manera de que la salida se imprima de forma bonita?
Setjmp
Esto es útil porque no requiere psql. Tenga en cuenta que los nombres de las funciones parecen estar reducidos.
Seamus Abshere
@Maxim, ¿sabe cómo detectar el tipo de retorno y los argumentos de entrada?
Fivell
@Fivell, por sólo nombres Arg, no tipos: SELECT proname, prosrc, proargnames FROM pg_proc WHERE proname like '%func_name%'. Esto al menos en la página 9.6. Puede obtener el código numérico del tipo a través de la propiedad proargtypes, pero necesitaría unirse con alguna otra tabla para obtener esto como nombres.
Thalis K.
16

Úselo \dfpara listar todos los procedimientos almacenados en Postgres.

Puneet Purohit
fuente
10

Si alguien se pregunta cómo consultar rápidamente las tablas del catálogo y hacer uso de la pg_get_functiondef()función, aquí está la consulta de muestra:

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>'
msciwoj
fuente
pg_get_functiondef () parece no manejar funciones agregadas definidas por el usuario. Cuando obtengo ERROR: "histograma" es una función agregada cuando consulto un UDA
Tim Child
2
[42809] ERROR: "array_agg" es una función agregada
Daniel L. VanDenBosch
1
@ DanielL.VanDenBosch corregido (para excluir simplemente funciones agregadas)
msciwoj
Me salvaste la vida ... pg_get_functiondef () se puede usar para buscar procesos con una palabra específica en la definiciónpg_get_functiondef(p.oid) ilike '%indicator_loss%'
Zero
0

También puede obtener phpPgAdmin si está configurado en su sistema,

Paso 1: seleccione su base de datos

Paso 2: haga clic en el botón Buscar

Paso 3: Cambie la opción de búsqueda a funciones y luego haga clic en Buscar.

Obtendrá la lista de funciones definidas. También puede buscar funciones por nombre, espero que esta respuesta ayude a otros.

Veeresh Digasangi
fuente
-1

Para ver el código completo (consulta) escrito en funciones / procedimientos almacenados, use el siguiente comando:

sp_helptext procedure/function_name

para el nombre de la función y el nombre del procedimiento, no agregue el prefijo 'dbo'. o 'sys.'.

no agregue corchetes al final del procedimiento o el nombre de la función y tampoco pase los parámetros.

use la palabra clave sp_helptext y luego simplemente pase el nombre del procedimiento / función.

use el siguiente comando para ver el código completo escrito para el procedimiento:

sp_helptext ProcedureName

use el siguiente comando para ver el código completo escrito para la función:

sp_helptext FunctionName
Developer_Suraj
fuente
No hay sp_helptexten postgresql.
GSerg
-2

Normalmente, usaría una aplicación de administrador de base de datos como pgAdmin , busque el objeto que le interese y haga clic con el botón derecho en "script as create" o similar.

¿Estás intentando hacer esto ... sin una aplicación de gestión?

Annakata
fuente
2
Solo la línea de comandos, sin aplicación de administración. Si pgAdmin puede hacerlo, tiene que estar usando algún tipo de comando, simplemente no puedo encontrar ninguna documentación al respecto. Estoy mirando las tablas pg_ * pero ninguna parece destacarse.
darren
Me alegra que hayas encontrado una respuesta, pero no estoy seguro de por qué te estás haciendo la vida más difícil. ¿Por qué no instalar pgAdmin?
Annakata
7
Cuando se conecta a una base de datos de forma remota en una sesión ssh, no es fácil ejecutar una aplicación de administración.
jutky