Skip site navigation (1) Skip section navigation (2)

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 (view raw or flat)
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) 

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





pgsql-es-ayuda by date

Next:From: Fernando HeviaDate: 2009-09-21 13:20:07
Subject: RE: Problemas de concurrencia?
Previous:From: Pedro MateoDate: 2009-09-20 18:55:32
Subject: sobre obtener definiciones de funciones

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group