Come visualizzare la funzione, la procedura, innesca il codice sorgente in postgresql?


168

Come stampare le funzioni e attivare il codice sorgente in postgresql? per favore fatemi sapere se qualcuno conosce la query per visualizzare la funzione, attiva il codice sorgente.


11
come una nota per i follower che sono arrivati ​​qui cercando di capire come elencare tutti i trigger, è select * from pg_trigger;o, se vuoi anche vedere quale tabella ogni trigger si applica a select tgrelid::regclass, tgname from pg_trigger;FWIW `
rogerdpack

Risposte:


152

\df+in psql ti dà il codice sorgente.


17
Bello :) Suggerisco di usare \dfper trovare il nome della tua funzione, quindi \xper l'output espanso, quindi\df+ name_of_function
Sam Watkins

33
\ df + genera molto di più del codice. Se tutto ciò che vuoi è il codice, \ sf farà il trucco!
Telic,

Come visualizzare le funzioni di un'ESTENSIONE installata? Esempio Sto usando ltree , ma non ci sono risposte con \df ltxtquery.
Peter Krauss,

\x ONè un must per la visualizzazione trasposta
andilabs

130

Per la funzione:

è possibile eseguire una query sulla vista pg_proc, proprio come segue

select proname,prosrc from pg_proc where proname= your_function_name; 

Un altro modo è quello di eseguire il comando \dfe \efche può elencare le funzioni.

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

Mostrerà il codice sorgente della funzione.

Per i trigger:

Non so se esiste un modo diretto per ottenere il codice sorgente. Basta sapere il seguente modo, potrebbe essere che ti aiuterà!

  • passaggio 1: ottieni il table oid del trigger:
    skytf => seleziona tgrelid da pg_trigger dove tgname = 'insert_tbl_tmp_trigger';
      tgrelid
    ---------
       26599
    (1 riga)
  • passaggio 2: ottieni il nome della tabella dell'oid sopra!
    skytf => seleziona oid, relname da pg_class dove oid = 26599;
      oid | relname           
    ------- + -----------------------------
     26599 | tbl_tmp
    (1 riga)
  • passaggio 3: elencare le informazioni sulla tabella
    skytf => \ d tbl_tmp

Ti mostrerà i dettagli del trigger della tabella. Di solito un trigger utilizza una funzione. Quindi puoi ottenere il codice sorgente della funzione trigger proprio come sopra indicato che ho sottolineato!


38

Ecco alcuni esempi di PostgreSQL-9.5

Elenco di visualizzazione:

  1. funzioni: \df+
  2. Trigger: \dy+

Visualizza definizione:

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$

7
L'uso di \xfirst per attivare la visualizzazione estesa aiuta anche con la leggibilità.
Tasche e

26

Ci sono molte possibilità Il modo più semplice è usare solo pgAdmin e ottenerlo dalla finestra SQL. Tuttavia, se si desidera ottenere questo livello di codice quindi examinate pg_proce pg_triggercataloghi di sistema o routinese triggersviste da schema di informazioni (che di SQL modo standard, ma non potrebbe coprire tutte le caratteristiche in particolare PostgreSQL-specifico). Per esempio:

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

3
Mmmm .. Ho funzioni PGPSQL, che hanno una routine_defintion vuota, e dichiarano 'EXTERNAL' nel campo routine_body. Qualche suggerimento dove posso trovarli?
Alfonso

2
+1 Questa è una soluzione più standard / portatile. Per le visualizzazioni l'SQL è:SELECT view_definition FROM information_schema.views WHERE table_schema = ? AND table_name = ?
Franta

Ma per quanto riguarda il caso in cui un nome di funzione non è univoco perché qualcuno ha creato funzioni con lo stesso nome e argomenti di funzione diversi? stackoverflow.com/questions/47341513/...
mg1075

@alfonx vedi pgproc.prosrccolonna
Tomáš Záluský

12

Leggermente più di una semplice visualizzazione della funzione, che ne dite di ottenere anche la funzione di modifica sul posto.

\ef <function_name>è molto utile. Si aprirà il codice sorgente della funzione in formato modificabile. Non solo potrai visualizzarlo, ma anche modificarlo ed eseguirlo.

Solo \efsenza nome_funzione si aprirà il modello CREATE FUNCTION modificabile.

Per ulteriori riferimenti -> https://www.postgresql.org/docs/9.6/static/app-psql.html


11

\sf nome_funzione in psql produce il codice sorgente modificabile di una singola funzione.

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

\ sf [+] function_description Questo comando recupera e mostra la definizione della funzione denominata, sotto forma di un comando CREATE OR REPLACE FUNCTION.

Se + viene aggiunto al nome del comando, le righe di output vengono numerate, con la prima riga del corpo della funzione come riga 1.


mostra il codice sorgente di una funzione. Il nome della funzione \ ef lo apre in un templet modificabile
amar


0

Dalla versione: psql (9.6.17, server 11.6)

Ho provato tutte le risposte sopra, ma per me

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 sembra non funzionare per me.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.