Transacties en foutafhandeling in PostgreSQL
Jason Myers
Principal Engineer
CREATE OR REPLACE FUNCTION function_name(
parameter1 TEXT,
parameter2 INTEGER
)
RETURNS BOOLEAN AS $$
DECLARE
BEGIN
STATEMENTS
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION debug_statement( sql_stmt TEXT ) RETURNS BOOLEAN AS $$DECLARE v_state TEXT; v_msg TEXT; v_detail TEXT; v_context TEXT;BEGIN BEGIN EXECUTE sql_stmt;
EXCEPTION WHEN others THEN GET STACKED DIAGNOSTICS v_state = RETURNED_SQLSTATE, v_msg = MESSAGE_TEXT, v_detail = PG_EXCEPTION_DETAIL, v_context = PG_EXCEPTION_CONTEXT; INSERT into errors (msg, state, detail, context) values (v_msg, v_state, v_detail, v_context); RETURN True;END; RETURN False; END; $$ LANGUAGE plpgsql;
SELECT debug_statement( 'UPDATE inventory SET cost = 35.0 WHERE name = ''Macaron'' ' );-[ RECORD 1 ]---+-- debug_statement | t
SELECT * FROM errors;-[ RECORD 1 ]---------------------------------------------------------------------- error_id | 20 state | 23514 msg | nieuwe rij voor relatie "inventory" schendt check-constraint "cost_check" detail | Mislukte rij bevat (7, 35, Macaron). context | SQL-statement "UPDATE inventory SET cost = 35.0 WHERE name = 'Macaron' " | PL/pgSQL-functie debug_statement(text) regel 9 bij EXECUTE
DO $$
DECLARE
stmt VARCHAR(100) := 'UPDATE inventory SET cost = 35.0 WHERE name = ''Macaron'' ';
BEGIN
EXECUTE stmt;
EXCEPTION WHEN OTHERS THEN
PERFORM debug_statement(stmt);
END; $$ language 'plpgsql';
SELECT * FROM errors;-[ RECORD 1 ]---------------------------------------------------------------------- error_id | 21 state | 23514 msg | nieuwe rij voor relatie "inventory" schendt check-constraint "cost_check" detail | Mislukte rij bevat (7, 35, Macaron). context | SQL-statement "UPDATE inventory SET cost = 35.0 WHERE name = 'Macaron' "+ | PL/pgSQL-functie debug_statement(text) regel 9 bij EXECUTE + | SQL-statement "SELECT debug_statement(stmt)" + | PL/pgSQL-functie inline_code_block regel 7 bij PERFORM
Transacties en foutafhandeling in PostgreSQL