Cómo determinar los códigos de error de PostgreSQL a partir del mensaje de error
En una función PL/pgSQL, quiero capturar un error. Por ejemplo, cuando convierto texto en número, obtengo un error (lo ejecuto en psql
, pero obtengo el mismo error en el cliente GUI Postico):
`select ‘a’::numeric;
ERROR: invalid input syntax for type numeric: “a”
LINE 1: select ‘a’::numeric;
^`
Para manejar este error, hice una cláusula de EXCEPCIÓN de la siguiente manera:
CREATE OR REPLACE FUNCTION public.to_number(input text) RETURNS numeric
AS $$
BEGIN
RETURN input::numeric;
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END
$$
LANGUAGE plpgsql
IMMUTABLE
RETURNS NULL ON NULL INPUT;
Sin embargo, no me gusta la condición WHEN OTHERS
.
¿Cómo puedo mapear el mensaje de error ERROR: invalid input syntax for type numeric: "a"
al mencionado en el Apéndice A. Códigos de error depostgresql
?
Quiero capturar el error de conversión al convertir a numeric
y ninguna otra condición (ya que la función anterior es una simplificada).
Tengo la sensación de que me falta algo, ¿pero qué?
davy.ai
Para asignar un mensaje de error a un código de error específico en la cláusula
EXCEPTION
de una función PL/pgSQL, puedes utilizar el campoSQLSTATE
en la variable de sistemaPG_EXCEPTION
. En este caso, puedes usar el código de error22018
, que corresponde a “valor de carácter no válido para la conversión”, como se define en la documentaciónerrcodes-appendix.html
.Aquí está una versión actualizada de la función PL/pgSQL que asigna el mensaje de error al código de error:
En esta versión, la cláusula
EXCEPTION
especifica el código de error22018
en lugar deOTHERS
, que es una condición de captura general. Ahora, la función solo atrapará el error de conversión al convertir ennumeric
.¡Espero que esto sea de ayuda!