2012-08-27 7 views

Odpowiedz

25

Aby definicja funkcji użyć pg_get_functiondef():

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

Istnieją podobne funkcje umożliwiające odzyskanie definicję indeksu, widok, z reguły i tak dalej. Aby uzyskać szczegółowe informacje, patrz instrukcja: http://www.postgresql.org/docs/current/static/functions-info.html

Uzyskanie definicji typu użytkownika jest nieco trudniejsze. Trzeba będzie zapytać information_schema.attributes na to:

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

Od że trzeba ponownie zmontować oświadczenie create type.

Więcej szczegółów trzeba będzie zapoznać się z dokumentacją w katalogu systemowym: http://www.postgresql.org/docs/current/static/catalogs.html

Ale trzeba preferują information_schema widoki jeśli wrócą te same informacje.

+0

Dzięki za odpowiedź. Mam około 8 typów użytkowników w mojej bazie danych, ale gdy patrzę w information_schema.attributes jest 0 wierszy. Dowolny pomysł? – John

+0

@John: nie mam pojęcia. Czy umieścisz definicję tych typów? Aby uzyskać więcej szczegółowych informacji, postępuj zgodnie ze wskazówkami Erwina i uruchomieniem psql za pomocą przełącznika -E, aby zobaczyć, których statystyk używa. Najprawdopodobniej coś obejmującego pg_type i pg_attribute. –

11

Znajdziesz psql -E instrumentalny w dążeniu do tych zapytań.
Wyświetla zapytania używające zapytań psql podczas wykonywania poleceń odwrotnego ukośnika - takich jak \df+ myfunc, aby uzyskać szczegółowe informacje na temat tej funkcji.

1

Powyżej znajduje się pełna zapytania próbki za pomocą 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 
;; 

Uwaga, należy oczywiście podać nazwę schematu (lub „public”, jeśli używasz tego schematu)

+0

Uwaga, preferuję ten format, ponieważ mogę użyć tego zapytania do wyszukania funkcji zawierających określony tekst w opisie (moja podstawowa dokumentacja funkcji) lub w definicji funkcji. –