Este artículo muestra cómo listar (y obtener información de) procedimientos o funciones en PostgreSQL tanto desde línea de comandos (psql) como a través de consultas SQL.



Listar procedimientos o funciones

Supongamos que hemos abierto una terminal psql y nos hemos conectado a una base de datos "pgdb":

postgres@dbserver:~$ psql
psql (10.3)
Type "help" for help.

postgres=# \c pgdb
You are now connected to database "pgdb" as user "postgres".

Es posible listar las funciones pertenecientes a la base de datos actual utilizando el comando \df:

pgdb=# \df
                                                                                                                        
                                                                                                                        
                                                                                                                        
                                                             List of functions
 Schema |           Name           | Result data type  |                                                                
                                                                                                                        
                                                                                                                        
                                                                                    Argument data types                 
                                                                                                                        
                                                                                                                        
                                                                                                                        
           |  Type  
--------+--------------------------+-------------------+----------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
-----------+--------
 public | create_language_plpgsql  | boolean           |                                                                
                                                                                                                        
                                                                                                                        
                                                                                                                        
                                                                                                                        
                                                                                                                        
                                                                                                                        
           | normal
 public | f_limpiar_acentos        | text              | text                                                           

Dependiendo de la cantidad y tipo de argumentos de todas las funciones listadas, la salida puede ser muy extensa y difícil de interpretar a simple vista. Esta salida utiliza el "paginador" (pager) configurado por defecto, que suele ser less en los sistemas GNU/Linux.

Si sólo nos interesa saber cuántos procedimientos o funciones existen (junto con sus nombres) y no nos interesan tanto sus parámetros, es posible obtener esta información directamente de la tabla "pg_catalog.pg_proc" (la cual almacena todas las funciones). A tal fin, recurrir a la siguiente consulta SQL:

SELECT proname
  FROM pg_catalog.pg_namespace namespace
  JOIN pg_catalog.pg_proc proc
  ON pronamespace = namespace.oid
  WHERE nspname = 'public';

Por ejemplo:

pgdb=# SELECT proname
FROM pg_catalog.pg_namespace namespace
JOIN pg_catalog.pg_proc proc
ON pronamespace = namespace.oid
WHERE nspname = 'public';
         proname
--------------------------
 f_prueba1
 f_limpiar_acentos
 create_language_plpgsql
 f_fechas_mes
 f_fechas
 create_user
 f_crear_log
(7 rows)

Listar los parámetros y retorno de un procedimiento o función

La salida de \df muestra la cantidad y tipo de los parámetros de entrada (Argument data types) y resultado (Result data type):

pgdb=# \df f_limpiar_acentos
                              List of functions
 Schema |       Name        | Result data type | Argument data types |  Type  
--------+-------------------+------------------+---------------------+--------
 public | f_limpiar_acentos | text             | text                | normal
(1 row)

Ambos datos también pueden obtenerse directamente de la tabla "pg_catalog.pg_proc":

pgdb=# SELECT proargtypes, prorettype
FROM pg_catalog.pg_proc proc
WHERE proname = 'f_limpiar_acentos';
 proargtypes | prorettype
-------------+------------
 25          |         25
(1 row)

Los números en ambas columnas corresponden con los oid de cada tipo en la tabla "pg_catalog.pg_type":

pgdb=# SELECT oid, typname
FROM pg_catalog.pg_type type
WHERE oid = 25;
 oid | typname
-----+---------
  25 | text
(1 row)

Para el caso de los argumentos cabe destacar que puede aparecer más de un valor, uno para cada argumento, en forma de vector. Ninguna de las dos columans (argumentos y valor de retorno) pueden ser nulas. A lo sumo serán de tipo "void" (oid igual a 2278 en Postgres 10).

Volcar el código fuente de un procedimiento o función

Probablemente se desee acceder al código fuente de una función. Desde el intérprete de comandos psql, utilizar el comando \df+ junto con el nombre de la función:

pgdb=# \df+ f_limpiar_acentos
                                                                                                 List of functions
 Schema |       Name        | Result data type | Argument data types |  Type  | Volatility | Parallel |  Owner   | Secur
ity |       Access privileges       | Language |         Source code         | Description 
--------+-------------------+------------------+---------------------+--------+------------+----------+----------+------
----+-------------------------------+----------+-----------------------------+-------------
 public | f_limpiar_acentos | text             | text                | normal | immutable  | unsafe   | postgres | invok
er  | rol_juantopo=X/postgres+| sql      |                            +| 
        |                   |                  |                     |        |            |          |          |
    | rol_pwrusr=X/postgres   |          | SELECT translate(          +| 
        |                   |                  |                     |        |            |          |          |
    |                               |          |     $1,                    +| 
        |                   |                  |                     |        |            |          |          |
    |                               |          |     'àáÁÀèéÉÈìíÌÍóòÓÒùúÙÚ',+| 
        |                   |                  |                     |        |            |          |          |
    |                               |          |     'aaAAeeEEiiIIooOOuuUU' +| 
        |                   |                  |                     |        |            |          |          |
    |                               |          | );                         +| 
        |                   |                  |                     |        |            |          |          |
    |                               |          |                             | 
(1 row)

Una vez más es posible obtener la misma información desde la columna "prosrc" de la tabla "pg_catalog.pg_proc":

pgdb=# SELECT prosrc
FROM pg_catalog.pg_proc proc
WHERE proname = 'f_limpiar_acentos';
           prosrc
-----------------------------
                            +
 SELECT translate(          +
     $1,                    +
     'àáÁÀèéÉÈìíÌÍóòÓÒùúÙÚ',+
     'aaAAeeEEiiIIooOOuuUU' +
 );                         +

(1 row)

Referencias


Tal vez pueda interesarte


Compartí este artículo