come visualizzare il codice completo della stored procedure?


111

Come si visualizza una stored procedure / funzione?

Supponiamo che io abbia una vecchia funzione senza la definizione originale: voglio vedere cosa sta facendo in pg / psql ma non riesco a trovare un modo per farlo.

utilizzando Postgres versione 8.4.1

Risposte:


19

utilizzare pgAdmin o utilizzare pg_proc per ottenere l'origine delle procedure memorizzate. pgAdmin fa lo stesso.


3
pg_proc questo è tutto! Accidenti, sono contento che abbiano risparmiato qualche byte di spazio non chiamandolo pg_procedure ... accidenti. :)
darren

14
È abbastanza facile scoprire quali query sta usando psql per recuperare quelle informazioni (ad esempio per il comando \ df) avviando psql con il parametro --echo-hidden. Questo mostrerà tutte le query utilizzate internamente. pg_proc non memorizza un'istruzione CREATE FUNCTION completa. Puoi usare pg_get_functiondef () per recuperare il sorgente completo.
a_horse_with_no_name

5
nel caso qualcuno sia confuso su dove sia quella tabella: pg_catalog -> tabella di sistema -> pg_proc
Dimitris

242

\df+ <function_name>in psql .


6
C'è un modo per stamparlo abbastanza? Il motivo per cui lo chiedo è perché questo lo rende illeggibile.
12hys

3
Questo è abbastanza stampato, per me. Ricorda se lo stai facendo in modo interattivo in psql e le righe vengono avvolte e il paginatore si attiva, quindi puoi disattivare le righe avvolte digitando "-S" (uguale a "less" arg della riga di comando), quindi utilizzare i tasti freccia per scorrere in giro.
Jonathan Hartley

10
Per motivi di leggibilità, è possibile utilizzare il \x meta comando psql prima di visualizzare la definizione della funzione. \xè utile anche per visualizzare i risultati delle query contenenti record con stringhe lunghe.
Stufato

149

\ef <function_name>in psql. Darà l'intera funzione con testo modificabile.


2
Risposta esatta. Questo aprirà la definizione della funzione nell'editor.
Ponnusamy K

2
Questa è la migliore risposta! Mostra la definizione della funzione in modo leggibile.
faramka

3
Non dimenticare di digitare ; <enter>dopo per eseguire il buffer.
profumato

4
ERROR: more than one function named
Brian Haak

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

Questo dice al gestore della funzione come invocare la funzione. Potrebbe essere il codice sorgente effettivo della funzione per le lingue interpretate, un simbolo di collegamento, un nome di file o qualsiasi altra cosa, a seconda della lingua di implementazione / convenzione di chiamata


Questo è utile. C'è un modo per avere l'output abbastanza stampato?
Setjmp

Questo è utile perché non richiede psql. Notare che i nomi delle funzioni sembrano essere abbassati.
Seamus Abshere

@ Maxim, sai come rilevare il tipo di ritorno e gli argomenti di input?
Fivell

@Fivell, per solo nomi Arg, non tipi: SELECT proname, prosrc, proargnames FROM pg_proc WHERE proname like '%func_name%'. Almeno a pagina 9.6. È possibile ottenere il codice numerico del tipo tramite proprietà proargtypes, ma è necessario unirsi a un'altra tabella per ottenerlo come nomi.
Thalis K.


10

Se qualcuno si chiede come eseguire rapidamente query sulle tabelle del catalogo e utilizzare la pg_get_functiondef()funzione, ecco la query di esempio:

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 () sembra non gestire le funzioni aggregate definite dall'utente. Quando ottengo ERRORE: "istogramma" è una funzione aggregata quando eseguo una query su un UDA
Tim Child

2
[42809] ERRORE: "array_agg" è una funzione aggregata
Daniel L. VanDenBosch

1
@ DanielL.VanDenBosch corretto (per escludere semplicemente funzioni aggregate)
msciwoj

Mi hai salvato la vita ... pg_get_functiondef () può essere utilizzato per trovare proc con una parola specifica nella definizionepg_get_functiondef(p.oid) ilike '%indicator_loss%'
Zero

0

Puoi anche ottenere da phpPgAdmin se lo hai configurato nel tuo sistema,

Passaggio 1: seleziona il tuo database

Passaggio 2: fare clic sul pulsante Trova

Passaggio 3: modificare l'opzione di ricerca in funzioni, quindi fare clic su Trova.

Otterrai l'elenco delle funzioni definite. Puoi anche cercare le funzioni per nome, spero che questa risposta possa aiutare gli altri.


-1

Per vedere il codice completo (query) scritto nella stored procedure / funzioni, utilizzare il comando seguente:

sp_helptext procedure/function_name

per il nome della funzione e il nome della procedura non aggiungere il prefisso "dbo". o "sys.".

non aggiungere parentesi alla fine della procedura o del nome della funzione e non passare i parametri.

utilizzare la parola chiave sp_helptext e quindi passare il nome della procedura / funzione.

utilizzare il comando seguente per vedere il codice completo scritto per la procedura:

sp_helptext ProcedureName

usa il comando seguente per vedere il codice completo scritto per la funzione:

sp_helptext FunctionName

Non c'è sp_helptextin postgresql.
GSerg

-2

Normalmente si utilizza un'applicazione di gestione DB come pgAdmin , si passa all'oggetto a cui si è interessati e si fa clic con il pulsante destro del mouse su "script come crea" o simile.

Stai provando a farlo ... senza un'app di gestione?


2
Solo la riga di comando, nessuna app di gestione. Se pgAdmin può farlo, deve usare una sorta di comando - non riesco a trovare alcuna documentazione a riguardo. Sto guardando le tabelle pg_ * ma nessuna sembra risaltare.
darren

Sono contento che tu abbia trovato una risposta, ma non so perché ti stai rendendo la vita difficile! Perché non installare semplicemente pgAdmin?
annakata

7
Quando ci si connette a un database in remoto in una sessione ssh non è facile eseguire un'app di gestione.
jutky
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.