es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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é?

Tags:  ,

Answer

  1. Avatar for 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 campo SQLSTATE en la variable de sistema PG_EXCEPTION. En este caso, puedes usar el código de error 22018, que corresponde a “valor de carácter no válido para la conversión”, como se define en la documentación errcodes-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:

    CREATE OR REPLACE FUNCTION public.to_number(input text) RETURNS numeric
        AS $$
    BEGIN
        RETURN input::numeric;
    EXCEPTION
        WHEN SQLSTATE '22018' THEN 
            RETURN NULL;
    END
    $$
        LANGUAGE plpgsql
        IMMUTABLE
        RETURNS NULL ON NULL INPUT;
    

    En esta versión, la cláusula EXCEPTION especifica el código de error 22018 en lugar de OTHERS, que es una condición de captura general. Ahora, la función solo atrapará el error de conversión al convertir en numeric.

    ¡Espero que esto sea de ayuda!

Comments are closed.