Generar una excepción con un contexto


13

Cuando PostgreSQL lanza una excepción, hay una línea "CONTEXTO" como:

    ERROR:  INSERT has more target COLUMNS than expressions
    LINE 3: ...
                                                         ^
    QUERY:  INSERT INTO ...
    CONTEXT:  PL/pgSQL FUNCTION "XXXXX" line 4 at SQL statement

Pero cuando lanzo una excepción, esta línea no está allí. No encontré cómo agregarlo.

    RAISE EXCEPTION 'blablabla' USING HINT = 'blablablabla';

¿Es posible agregar esta línea a mi excepción?

Respuestas:


13

No pude encontrar una forma directa de generar la CONTEXTlínea con una excepción definida por el usuario. Esta opción simplemente no está implementada (todavía) en PostgreSQL 9.1. Lee el manual aquí .
Sin embargo, encontré un ...

Solución alterna

... eso debería funcionar perfectamente . Puede hacer que plpgsql se comporte como lo desee llamando a otra función que genere el error por usted. Esto funciona con PostgreSQL 9.0 o posterior .
Para la versión 8.4, debe realizar un ajuste menor: no se pueden asignar parámetros.

Función para generar un error (advertencia, aviso, ...) con un mensaje definido por el usuario y CONTEXT:

CREATE OR REPLACE FUNCTION f_raise(_lvl text = 'EXCEPTION'
                                 , _msg text = 'Default error msg.')
  RETURNS void AS
$func$
BEGIN
   CASE upper(_lvl)
      WHEN 'EXCEPTION' THEN RAISE EXCEPTION '%', _msg;
      WHEN 'WARNING'   THEN RAISE WARNING   '%', _msg;
      WHEN 'NOTICE'    THEN RAISE NOTICE    '%', _msg;
      WHEN 'DEBUG'     THEN RAISE DEBUG     '%', _msg;
      WHEN 'LOG'       THEN RAISE LOG       '%', _msg;
      WHEN 'INFO'      THEN RAISE INFO      '%', _msg;
      ELSE RAISE EXCEPTION 'f_raise(): unexpected raise-level: "%"', _lvl;
   END CASE;
END
$func$  LANGUAGE plpgsql;

COMMENT ON FUNCTION f_raise(text, text) IS 'Raise error or given level with msg and context.
Call from inside another function instead of raising an error directly
  to get plpgsql to add CONTEXT (with line number) to error message.
$1 .. error level: EXCEPTION | WARNING | NOTICE | DEBUG | LOG | INFO
$2 .. error message';

Use la función para generar un error como este:

CREATE OR REPLACE FUNCTION test_err(text)
  RETURNS void AS
$func$
BEGIN
   -- do stuff    

   IF TRUE THEN  -- some condition here?
      -- instead of raising error like this:
      -- RAISE EXCEPTION 'unexpected parameter: "%"', $1;
      PERFORM f_raise('EXCEPTION', 'My message "' || $1 || '"');
   END IF;
END
$func$  LANGUAGE plpgsql;

Llamada:

SELECT test_err('wrong parameter');

Valores predeterminados y parámetros con nombre

Mejoré la sintaxis y agregué valores predeterminados a la definición de la función. Si lo llama sin parámetros (o solo uno) y los valores predeterminados se utilizarán para los valores faltantes. En combinación con parámetros con nombre , puede hacer casi cualquier cosa. Ejemplos:

SELECT f_raise();
SELECT f_raise('WARNING');
SELECT f_raise(_msg := 'boohoo');
SELECT f_raise(_lvl := 'WARNING');
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.