Capturarea contextului stivei
Obținerea contextului stivei – similar cu un stack trace din alte limbaje – este o metodă puternică de depanare a funcțiilor complexe și imbricate.
În codul de mai jos, vrem să capturăm contextul stivei și să îl înregistrăm în handlerele de excepții ale ambelor blocuri imbricate. Apoi, vom analiza rezultatul din tabelul de erori pentru a identifica ce cauzează excepția în această funcție.
Acest exercițiu face parte din cursul
Tranzacții și gestionarea erorilor în PostgreSQL
Instrucțiuni pentru exercițiu
- Declară o variabilă text,
exc_context, pentru a reține contextul stivei. - Stochează
PG_EXCEPTION_CONTEXTîn variabilaexc_contextdin primul handler. - Stochează
PG_EXCEPTION_DETAILîn variabilaexc_detaildin cel de-al doilea handler. - Înregistrează atât mesajul de eroare, cât și contextul stivei în ambele blocuri.
Exercițiu interactiv practic
Încearcă acest exercițiu completând acest cod de exemplu.
DO $$
DECLARE
exc_message text;
exc_details text;
-- Declare a variable, exc_context to hold the exception context
___ ___;
BEGIN
BEGIN
INSERT INTO patients (a1c, glucose, fasting) values (5.6, 93, TRUE),
(6.3, 111, TRUE),(4.7, 65, TRUE);
EXCEPTION
WHEN others THEN
-- Store the exception context in exc_context
GET STACKED DIAGNOSTICS exc_message = MESSAGE_TEXT,
___ = ___;
-- Record both the msg and the context
INSERT INTO errors (msg, context)
VALUES (___, ___);
END;
BEGIN
UPDATE patients set fasting = 'true' where id=1;
EXCEPTION
WHEN others THEN
-- Store the exception detail in exc_details
GET STACKED DIAGNOSTICS exc_message = MESSAGE_TEXT,
___ = ___;
INSERT INTO errors (___, ___)
VALUES (exc_message, exc_context);
END;
END$$;
SELECT * FROM errors;