PostgreSQL 9.2: GET STACKED DIAGNOSTICS in PL/pgSQL

PostgreSQL 9.2 introduce una nuova istruzione in PL/pgSQL: GET STACKED DIAGNOSTICS.

Questo comando espone varie informazioni riguardanti un’eccezione intercettata in PL/pgSQL. In particolare:

  • RETURNED_SQLSTATE: codice dell’errore
  • MESSAGE_TEXT: messaggio dell’errore
  • PG_EXCEPTION_DETAIL: dettagli aggiuntivi sull’errore (ove disponibili)
  • PG_EXCEPTION_HINT: suggerimenti sulle possibili cause (ove disponibili)
  • PG_EXCEPTION_CONTEXT: contesto in cui si è verificato l’errore

Questo comando è un’estensione del già presente GET DIAGNOSTICS.

Avere a disposizione tutte queste informazioni rende il debug del proprio codice estremamente migliore.

L’esempio sottostante permette di vedere il comando all’opera, accedendo all’interno della funzione debug a informazioni estese riguardanti l’eccezione.

BEGIN;

CREATE TABLE t (
    id INTEGER PRIMARY KEY,
    mess TEXT
);

CREATE OR REPLACE FUNCTION debug(
    i_sql TEXT
)
RETURNS BOOLEAN AS
$BODY$

    DECLARE
        v_state   TEXT;
        v_msg     TEXT;
        v_detail  TEXT;
        v_hint    TEXT;
        v_context TEXT;
    BEGIN
        BEGIN
            EXECUTE i_sql;
        EXCEPTION WHEN others THEN
            GET STACKED DIAGNOSTICS
                v_state   = RETURNED_SQLSTATE,
                v_msg     = MESSAGE_TEXT,
                v_detail  = PG_EXCEPTION_DETAIL,
                v_hint    = PG_EXCEPTION_HINT,
                v_context = PG_EXCEPTION_CONTEXT;
            raise notice E'Got exception:
                state  : %
                message: %
                detail : %
                hint   : %
                context: %', v_state, v_msg, v_detail, v_hint, v_context;
            RETURN False;
        END;
        RETURN True;
    END;

$BODY$
LANGUAGE plpgsql;

-- Un'istruzione SQL valida
SELECT debug('SELECT 1');
-- Un'istruzione SQL valida
SELECT debug('INSERT INTO t VALUES(1)');
-- Un errore (chiave duplicata)
SELECT debug('INSERT INTO t VALUES(1)');
-- Un errore di sintassi
SELECT debug('INSERT t VALUES(2)');

ROLLBACK;

This Post Has 0 Comments

Leave A Reply