2012-08-27 16 views

Respuesta

25

para obtener la definición de una función usar pg_get_functiondef():

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

Hay algunas funciones similares a recuperar la definición de un índice, una visión, una regla y así sucesivamente. Para más detalles, consulte el manual: http://www.postgresql.org/docs/current/static/functions-info.html

Obtener la definición de un tipo de usuario es un poco más complicado. Usted tendrá que consultar information_schema.attributes para ello:

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

Desde que es necesario volver a montar la declaración create type.

Para más detalles que tendrá que leer a través de la documentación del catálogo del sistema: http://www.postgresql.org/docs/current/static/catalogs.html

Pero se debe preferir information_schema vistas si devuelven la misma información.

+0

Gracias por su respuesta. Tengo alrededor de 8 tipos de usuarios en mi base de datos, pero cuando miro en information_schema.attributes, hay 0 filas. ¿Alguna idea? – John

+0

@John: no tengo idea. ¿Puedes publicar la definición de esos tipos? Para obtener más declaraciones, siga los consejos de Erwin y arranque psql usando el interruptor -E para ver qué statemtents está usando. Lo más probable es que tenga algo que ver con pg_type y pg_attribute. –

11

Encontrará psql -E instrumental en su búsqueda de esas consultas.
Muestra las consultas que utiliza psql al ejecutar sus comandos de barra invertida, como \df+ myfunc, para obtener detalles sobre esta función.

1

Aquí es una consulta completa muestra usando 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 
;; 

Tenga en cuenta, obviamente debe especificar el nombre de esquema, (o "público" si está utilizando ese esquema)

+0

Nota, prefiero este formato porque puedo usar esta consulta para buscar funciones que contengan texto específico en la descripción (la documentación de mi función básica) o en la definición de la función. –

Cuestiones relacionadas