我有一个大表“ Foo”,具有数百万行,为简单起见,让表具有3列:bigint类型的“ @ID”,HSTORE格式的文本类型的“ hs_params”和int类型的“ number”。我需要将“ number”写为“ 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 $$;