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)
================================================================
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 |