Transazioni e gestione degli errori in PostgreSQL
Jason Myers
Principal Engineer
DO $$
BEGIN
-- Block 1
BEGIN
UPDATE inventory SET cost = 2.33 WHERE name = 'Linga';
UPDATE inventory SET cost = 2.33 WHERE name = 'Petit-Beurre';
EXCEPTION
WHEN others THEN
INSERT INTO errors (msg) VALUES ('Max cost is 10!');
RAISE INFO 'Max cost is 10!';
END;
-- Block 2
BEGIN
UPDATE inventory SET cost = 35.0 WHERE name = 'Macaron';
EXCEPTION
WHEN others THEN
INSERT INTO errors (msg) VALUES ('Max cost is 10!');
RAISE INFO 'Max cost is 10!';
END;
END;
$$ language 'plpgsql';
DO $$
DECLARE
exc_message text;
exc_detail text;
exc_context text;
BEGIN
-- Block 1
BEGIN
UPDATE inventory SET cost = 2.33 WHERE name = 'Linga';
UPDATE inventory SET cost = 2.33 WHERE name = 'Petit-Beurre';
EXCEPTION
WHEN others THEN
GET STACKED DIAGNOSTICS exc_message = MESSAGE_TEXT,
exc_detail = PG_EXCEPTION_DETAIL,
exc_context = PG_EXCEPTION_CONTEXT;
INSERT INTO errors (msg,detail, context)
VALUES (exc_message, exc_detail, exc_context);
END;
-- Block 2
BEGIN
UPDATE inventory SET cost = 35.0 WHERE name = 'Macaron';
EXCEPTION
WHEN others THEN
GET STACKED DIAGNOSTICS exc_message = MESSAGE_TEXT,
exc_detail = PG_EXCEPTION_DETAIL,
exc_context = PG_EXCEPTION_CONTEXT;
INSERT INTO errors (msg,detail, context)
VALUES (exc_message, exc_detail, exc_context);
END;
END$$;
DO $$
DECLARE
exc_message text;
exc_detail text;
exc_context text;
BEGIN
-- Block 1
BEGIN
UPDATE inventory SET cost = 2.33 WHERE name = 'Linga';
UPDATE inventory SET cost = 2.33 WHERE name = 'Petit-Beurre';
EXCEPTION
WHEN others THEN
GET STACKED DIAGNOSTICS exc_message = MESSAGE_TEXT,
exc_detail = PG_EXCEPTION_DETAIL,
exc_context = PG_EXCEPTION_CONTEXT;
INSERT INTO errors (msg,detail, context)
VALUES (exc_message, exc_detail, exc_context);
END;
-- Block 2
BEGIN
UPDATE inventory SET cost = 35.0 WHERE name = 'Macaron';
EXCEPTION
WHEN others THEN
GET STACKED DIAGNOSTICS exc_message = MESSAGE_TEXT,
exc_detail = PG_EXCEPTION_DETAIL,
exc_context = PG_EXCEPTION_CONTEXT;
INSERT INTO errors (msg,detail, context)
VALUES (exc_message, exc_detail, exc_context);
END;
END$$;
INFO: Messaggio: la nuova riga per la relazione "inventory" viola il vincolo di check
"cost_check" | Dettagli: La riga non valida contiene (7, 35, Macaron). | Contesto
istruzione SQL "UPDATE inventory SET cost = 35.0 WHERE name = 'Macaron'"
Funzione PL/pgSQL inline_code_block riga 23 all'istruzione SQL
DO
postgres=# \x on
Visualizzazione espansa attiva.
postgres=# select * from errors;
-[ RECORD 1 ]---------------------------------------------------------------------
error_id | 15
state |
msg | la nuova riga per la relazione "inventory" viola il vincolo di check "cost_check"
detail | La riga non valida contiene (7, 35, Macaron).
context | istruzione SQL "UPDATE inventory SET cost = 35.0 WHERE name = 'Macaron'"+
| Funzione PL/pgSQL inline_code_block riga 23 all'istruzione SQL
Transazioni e gestione degli errori in PostgreSQL