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
- PostgreSQL Documentation - psql
- PostgreSQL Documentation - pg_proc
- PostgreSQL Documentation - pg_namespace
- PostgreSQL Documentation - pg_type