¿Cómo mostrar la función, procedimiento, activa el código fuente en postgresql?


168

¿Cómo imprimir funciones y dispara código fuente en postgresql? avíseme si alguien conoce la consulta para mostrar la función, activa el código fuente.


11
como una nota para los seguidores que llegaron aquí tratando de descubrir cómo enumerar todos los desencadenantes, es select * from pg_trigger;o, si también desea ver qué tabla aplica cada desencadenante a select tgrelid::regclass, tgname from pg_trigger;FWIW `
rogerdpack

Respuestas:


152

\df+en psql te da el código fuente.


17
Bonito :) Sugiero usar \dfpara encontrar el nombre de su función, luego \xpara una salida ampliada, luego\df+ name_of_function
Sam Watkins

33
\ df + genera mucho más que el código. Si todo lo que quieres es el código, \ sf hará el truco.
Telic

¿Cómo ver las funciones de una EXTENSIÓN instalada? Ejemplo Estoy usando ltree , pero no hay respuesta con \df ltxtquery.
Peter Krauss el

\x ONes imprescindible para la visualización transpuesta
andilabs

130

Para la función:

puede consultar la vista pg_proc, tal como se muestra a continuación

select proname,prosrc from pg_proc where proname= your_function_name; 

Otra forma es que simplemente ejecute el commont \dfy \efque pueda enumerar las funciones.

skytf=> \df           
                                             List of functions
 Schema |         Name         | Result data type |              Argument data types               |  Type  
--------+----------------------+------------------+------------------------------------------------+--------
 public | pg_buffercache_pages | SETOF record     |                                                | normal


skytf=> \ef  pg_buffercache_pages

Mostrará el código fuente de la función.

Para desencadenantes:

No sé si hay una forma directa de obtener el código fuente. Solo conozca la siguiente manera, ¡puede ser que lo ayude!

  • Paso 1: Obtenga la tabla oid del desencadenador:
    skytf => seleccione tgrelid de pg_trigger donde tgname = 'insert_tbl_tmp_trigger';
      tgrelid
    ---------
       26599
    (1 fila)
  • Paso 2: ¡Obtén el nombre de la tabla del oid anterior!
    skytf => seleccione oid, relname de pg_class donde oid = 26599;
      oid | renombrar           
    ------- + -----------------------------
     26599 | tbl_tmp
    (1 fila)
  • Paso 3: enumera la información de la tabla
    skytf => \ d tbl_tmp

Le mostrará los detalles del disparador de la tabla. Por lo general, un disparador usa una función. ¡Para que pueda obtener el código fuente de la función de activación tal como se indicó anteriormente!


38

Aquí hay algunos ejemplos de PostgreSQL-9.5

Mostrar lista:

  1. Funciones: \df+
  2. Disparadores: \dy+

Definición de pantalla:

postgres=# \sf
function name is required

postgres=# \sf pg_reload_conf()
CREATE OR REPLACE FUNCTION pg_catalog.pg_reload_conf()
 RETURNS boolean
 LANGUAGE internal
 STRICT
AS $function$pg_reload_conf$function$

postgres=# \sf pg_encoding_to_char
CREATE OR REPLACE FUNCTION pg_catalog.pg_encoding_to_char(integer)
 RETURNS name
 LANGUAGE internal
 STABLE STRICT
AS $function$PG_encoding_to_char$function$

77
Usar \xprimero para encender la pantalla expandida también ayuda con la legibilidad.
Bolsillos y

26

Hay muchas posibilidades La forma más simple es usar pgAdmin y obtener esto de la ventana SQL. Sin embargo, si usted desea conseguir esto mediante programación a continuación examinate pg_procy pg_triggercatálogos del sistema o routinesy triggersvistas de esquema de información (que de forma estándar SQL, pero podría no cubrir todas las características especialmente PostgreSQL-específico). Por ejemplo:

SELECT
    routine_definition 
FROM
    information_schema.routines 
WHERE
    specific_schema LIKE 'public'
    AND routine_name LIKE 'functionName';

3
Mmmm ... Tengo funciones de PGPSQL, que tienen una definición de rutina vacía, y el estado 'EXTERNO' en el campo rutina_cuerpo. ¿Alguna pista de dónde puedo encontrarlos?
alfonx

2
+1 Esta es una solución más estándar / portátil. Para las vistas, el SQL es:SELECT view_definition FROM information_schema.views WHERE table_schema = ? AND table_name = ?
Franta

Pero, ¿qué pasa con el caso en que el nombre de una función no es único porque alguien realizó funciones con el mismo nombre y diferentes argumentos de función? stackoverflow.com/questions/47341513/…
mg1075

@alfonx ver pgproc.prosrccolumna
Tomáš Záluský 01 de

12

Algo más que solo mostrar la función, ¿qué hay de obtener también la función de edición en el lugar?

\ef <function_name>Es muy útil. Se abrirá el código fuente de la función en formato editable. No solo podrá verlo, también puede editarlo y ejecutarlo.

Solo \efsin function_name se abrirá la plantilla editable CREATE FUNCTION.

Para mayor referencia -> https://www.postgresql.org/docs/9.6/static/app-psql.html


11

\sf function_name en psql produce el código fuente editable de una sola función.

Desde https://www.postgresql.org/docs/9.6/static/app-psql.html :

\ sf [+] function_description Este comando obtiene y muestra la definición de la función nombrada, en forma de un comando CREAR O REEMPLAZAR FUNCIÓN.

Si se agrega + al nombre del comando, las líneas de salida están numeradas, siendo la primera línea del cuerpo de la función la línea 1.


muestra el código fuente de una función. El nombre de la función \ ef lo abre en templet editable
amar


0

Desde la versión: psql (9.6.17, servidor 11.6)

He intentado todas las respuestas anteriores, pero para mí

postgres=> \sf jsonb_extract_path_text
CREATE OR REPLACE FUNCTION pg_catalog.jsonb_extract_path_text(from_json jsonb, VARIADIC path_elems text[])
 RETURNS text
 LANGUAGE internal
 IMMUTABLE PARALLEL SAFE STRICT
AS $function$jsonb_extract_path_text$function$



postgres=> \df+
ERROR:  column p.proisagg does not exist
LINE 6:   WHEN p.proisagg THEN 'agg'
               ^
HINT:  Perhaps you meant to reference the column "p.prolang".

DF parece que no funciona para mí.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.