Genera un'eccezione con un contesto


13

Quando PostgreSQL genera un'eccezione, c'è una riga "CONTESTO" come:

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

Ma quando lancio un'eccezione, questa linea non c'è. Non ho trovato come aggiungerlo.

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

È possibile aggiungere questa riga alla mia eccezione?

Risposte:


13

Non sono riuscito a trovare un modo diretto per generare la CONTEXTlinea con un'eccezione definita dall'utente. Questa opzione non è implementata (ancora) in PostgreSQL 9.1. Leggi il manuale qui .
Tuttavia, ho trovato un ...

Soluzione

... che dovrebbe funzionare in modo impeccabile . Puoi fare in modo che plpgsql si comporti come desiderato chiamando un'altra funzione che genera l'errore per te. Funziona con PostgreSQL 9.0 o successivo .
Per la versione 8.4 è necessario apportare una piccola modifica: non è possibile assegnare parametri.

Funzione per generare un errore (avviso, avviso, ..) con un messaggio definito dall'utente e 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';

Utilizzare la funzione per generare un errore come questo:

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;

Chiamata:

SELECT test_err('wrong parameter');

Valori predefiniti e parametri nominati

Ho migliorato la sintassi e aggiunto valori predefiniti alla definizione della funzione. Se lo chiami senza parametri (o solo uno) e i valori predefiniti verranno utilizzati per i valori mancanti. In combinazione con parametri denominati , puoi fare praticamente qualsiasi cosa. Esempi:

SELECT f_raise();
SELECT f_raise('WARNING');
SELECT f_raise(_msg := 'boohoo');
SELECT f_raise(_lvl := 'WARNING');
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.