sobre obtener definiciones de funciones

From: Pedro Mateo <pedromateoa(at)gmail(dot)com>
To: ayuda postgres <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: sobre obtener definiciones de funciones
Date: 2009-09-20 18:55:32
Message-ID: c245e4540909201155sfb9cda7x2053a27aa09a3a60@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

hola a todos
resulta que a mi no me gusta mucho pgadmin para hacer consultas en postgres,
de hecho prefier psql

el problema con psql es que si necesitas editar una funcion no tienes forma
de hacerlo (sin tener que copiar y pegar jjjejejej)

forzando la jugada creo que encontre una forma un poco mas practica de
hacerlo pero me parece que se puede hacer mejor
la comparto con todos ustedes porque se que muchos han tenido una necesidad
de este tipo

lo que hago es crear una view con el nombre y la definicion de todas las
funciones (incluye las del sistema, cosa que me gustaria mejorar)

el view le he llamado df y tiene 2 campos: funcion y definicion

para mandar la definicion de una funcion a un archivo hago esto desde el
shell:

psql -c "copy (select definicion from df where funcion='mi_funcion') stdout
with csv ">archivo_destino.sql

cuando tengo mi arhivo lo edito con gedit (perdon los fanaticos vi)

luego luego lo ejecuto con psql -f archivo_destino.sql

me resulta mas facil tener un shell y un editor grafico abierto que el
pgadmin

hay un par de cosas que me gustaria mejorar
1- como veran hago un copy con destino al stdout en formato csv, lo que me
da como resultado que en la definicion de mi fucion aparece una comilla al
principio y otra en el final

2- en el view aparence las funciones del sistema y me gustaria que no
aparecieran

3- si lo pueden poner en una funcion seria un exito, yo no pude porque me da
un error de escritura cuando intento mandar a un archivo en vez del stdout

4- no domino el ingles por lo que no se como proponerle a los
desarrolladores de psql incluirle esa tonteria,
algo asi como \edit mi_objeto que mandaria al buffer el script de
creacion del objeto (no me digan que no les gustaria!!)

el view lo obtuve al ingresar al psql con la opcion -E que hace que el psql
te muestre las consultas que ejecuta para desplegar informacion informacion
en la pantalla

gracias por su tiempo
espero sus sugerencias

a continuacion les dejo la definicion del view:

==================================================================
create view df as
SELECT p.proname as funcion,'create or replace '||p.proname||'('||
CASE WHEN p.proretset THEN 'setof ' ELSE '' END ||
CASE WHEN proallargtypes IS NOT NULL THEN
pg_catalog.array_to_string(ARRAY(
SELECT
CASE
WHEN p.proargmodes[s.i] = 'i' THEN ''
WHEN p.proargmodes[s.i] = 'o' THEN 'OUT '
WHEN p.proargmodes[s.i] = 'b' THEN 'INOUT '
END ||
CASE
WHEN COALESCE(p.proargnames[s.i], '') = '' THEN ''
ELSE p.proargnames[s.i] || ' '
END ||
pg_catalog.format_type(p.proallargtypes[s.i], NULL)
FROM
pg_catalog.generate_series(1,
pg_catalog.array_upper(p.proallargtypes, 1)) AS s(i)
), ', ')
ELSE
pg_catalog.array_to_string(ARRAY(
SELECT
CASE
WHEN COALESCE(p.proargnames[s.i+1], '') = '' THEN ''
ELSE p.proargnames[s.i+1] || ' '
END ||
pg_catalog.format_type(p.proargtypes[s.i], NULL)
FROM
pg_catalog.generate_series(0,
pg_catalog.array_upper(p.proargtypes, 1)) AS s(i)
), ', ')
END||')returns '||pg_catalog.format_type(p.prorettype, NULL)||'
language '||l.lanname
||' as $body$'||p.prosrc||'$body$' as definicion
FROM pg_catalog.pg_proc p
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
LEFT JOIN pg_catalog.pg_language l ON l.oid = p.prolang
JOIN pg_catalog.pg_roles r ON r.oid = p.proowner
WHERE p.prorettype <> 'pg_catalog.cstring'::pg_catalog.regtype
AND (p.proargtypes[0] IS NULL
OR p.proargtypes[0] <>
'pg_catalog.cstring'::pg_catalog.regtype)
AND NOT p.proisagg
AND pg_catalog.pg_function_is_visible(p.oid)

================================================================

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Marcos Luis Ortiz Valmaseda 2009-09-20 19:43:35 Re: sobre obtener definiciones de funciones
Previous Message Sergio Gabriel Rodriguez 2009-09-19 02:08:31 Re: GRANT SELECT para todas las tablas de una base