Variable err_msg has length of 100 and with
SUBSTR(SQLERRM(SQLCODE), 1, 250) err_msg can be too small.

Try:

DECLARE
err_num NUMBER;
err_msg VARCHAR2(100);
BEGIN
INSERT INTO ...
INSERT INTO ...
UPDATE…

EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
err_msg := SUBSTR(SQLERRM(SQLCODE), 1, 100);
INSERT INTO db_errors(err_msg) VALUES (err_msg);
END;
/