Re: sobre obtener definiciones de funciones

From: Marcos Luis Ortiz Valmaseda <mlortiz(at)uci(dot)cu>
To: Pedro Mateo <pedromateoa(at)gmail(dot)com>
Cc: ayuda postgres <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: sobre obtener definiciones de funciones
Date: 2009-09-20 19:43:35
Message-ID: 2015510681.1201341253475815083.JavaMail.root@ucimail4.uci.cu
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Ya se puede hacer más fácilmente desde psql en la versión 8.4.
Por ejemplo:
1- \df nombre_funcion
\df+ nombre_funcion
Estos comandos muestran la definición de la función

2- \ef nombre_funcion
Abre la definición de la función para su edición.

3- \df
Lista todas las funciones del usuario

4- \dfS
Lista todas las funciones

Espero que te haya servido de algo

Saludos

"The hurry is enemy of the success: for that reason.......Be patient"

Ing. Marcos L. Ortiz Valmaseda
Línea Soporte y Despliegue
Centro de Tecnologías de Almacenamiento y Análisis de Datos (CENTALAD)

Linux User # 418229
PostgreSQL User
http://www.postgresql.org
http://www.planetpostgresql.org/
http://www.postgresql-es.org/

----- Mensaje original -----
De: "Pedro Mateo" <pedromateoa(at)gmail(dot)com>
Para: "ayuda postgres" <pgsql-es-ayuda(at)postgresql(dot)org>
Enviados: Domingo, 20 de Septiembre 2009 8:55:32 GMT -10:00 Hawai
Asunto: [pgsql-es-ayuda] sobre obtener definiciones de funciones

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 Fernando Hevia 2009-09-21 13:20:07 RE: Problemas de concurrencia?
Previous Message Pedro Mateo 2009-09-20 18:55:32 sobre obtener definiciones de funciones