2012-08-27 7 views

risposta

25

per ottenere la definizione di una funzione utilizzare pg_get_functiondef():

select pg_get_functiondef(oid) 
from pg_proc 
where proname = 'foo'; 

ci sono funzioni simili per recuperare la definizione di un indice, una visione, una regola e così via. Per i dettagli consultare il manuale: http://www.postgresql.org/docs/current/static/functions-info.html

Ottenere la definizione di un tipo di utente è un po 'più complicato. Sarà necessario eseguire una query information_schema.attributes per questo:

select attribute_name, data_type 
from information_schema.attributes 
where udt_schema = 'public' 
    and udt_name = 'footype' 
order by ordinal_postion; 

Da che è necessario riassemblare la dichiarazione create type.

Per maggiori dettagli sarà necessario leggere la documentazione del catalogo di sistema: http://www.postgresql.org/docs/current/static/catalogs.html

Ma si dovrebbe preferire information_schema vista in caso di ritorno le stesse informazioni.

+0

Grazie per la risposta. Ho circa 8 tipi di utenti nel mio database ma quando guardo in information_schema.attributes ci sono 0 righe. Qualche idea? – John

+0

@ John: nessuna idea. Puoi pubblicare la definizione di questi tipi? Per ottenere maggiori dettagli, le istruzioni seguono il consiglio di Erwin e l'avvio di psql usando l'opzione -E per vedere quali statimtenti sta usando. Molto probabilmente qualcosa che coinvolge pg_type e pg_attribute. –

11

Troverete psql -E strumentale nella vostra ricerca per quelle domande.
Visualizza le query psql utilizzate durante l'esecuzione dei comandi backslash, ad esempio \df+ myfunc, per i dettagli su questa funzione.

1

Ecco una query completa campione utilizzando pg_get_functiondef:

WITH funcs AS (
    SELECT 
    n.nspname AS schema 
    ,proname AS sproc_name 
    ,proargnames AS arg_names 
    ,t.typname AS return_type 
    ,d.description 
    ,pg_get_functiondef(p.oid) as definition 
    FROM pg_proc p 
    JOIN pg_type t on p.prorettype = t.oid 
    JOIN pg_description d on p.oid = d.objoid 
    JOIN pg_namespace n on n.oid = p.pronamespace 
    WHERE n.nspname = 'some_schema_name_here' 
) 
SELECT * 
FROM funcs 
;; 

nota, si dovrebbe, ovviamente, specificare il nome dello schema, (o "pubblico" se si utilizza tale schema)

+0

Nota, preferisco questo formato perché posso utilizzare questa query per cercare funzioni contenenti testo specifico nella descrizione (la documentazione della mia funzione di base) o nella definizione della funzione. –

Problemi correlati