У меня есть большая таблица «Foo» с миллионами строк, для простоты пусть таблица имеет 3 столбца: «@ID» типа bigint, «hs_params» типа текста в формате HSTORE и «число» типа int.Мне нужно написать «номер» в «hs_params» как «NUMBER» (или обновить, если он уже существует).Проблема заключается в том, что в некоторых записях "hs_params" не является допустимым HSTORE, и при попытке его приведения генерируется исключение "internal_error" (код XX000).Я попытался выяснить "@ID" строк, в которых хранятся неправильные параметры, используя приведенный ниже код, но он работает в течение 2 часов и вылетает, когда я теряю связь с базой данных, поэтому похоже, что запрос не долженпросто обрабатывать исключение, но также быть максимально быстрым.
DO $$
DECLARE
r record;
hs hstore;
BEGIN
FOR r IN SELECT * FROM "Foo"
LOOP
BEGIN
hs = r."hs_params"::hstore;
EXCEPTION WHEN internal_error THEN
raise notice 'ERROR on % with hs text %', r."@ID", r."hs_params";
END;
END LOOP;
END $$;