A resposta correta é um comentário de Anton Kovalenko
Você não pode usar variável como nome de tabela ou coluna no SQL incorporado nunca.
UPDATE dynamic_table_name SET ....
O PostgreSQL usa planos preparados e salvos para SQL embutido, e as referências a objetos de destino (tabelas) são profundas e codificadas nos planos - algumas características têm impacto significativo nos planos - para uma tabela pode ser usada o índice, para outra não. O planejamento de consultas é relativamente lento, então o PostgreSQL não o tenta de forma transparente (sem poucas exceções).
Você deve usar um SQL dinâmico - um único propósito está usando para situações semelhantes. Você gera uma nova string SQL sempre e os planos não são salvos
DO $$
DECLARE r record;
BEGIN
FOR r IN SELECT table_name
FROM information_schema.tables
WHERE table_catalog = 'public'
LOOP
EXECUTE format('UPDATE %I SET id = 10 WHERE id = 15', r.table_name);
END LOOP;
END $$;
Atenção:SQL dinâmico é inseguro (há uma injeção de SQL riscos) sem higienização de parâmetros. Usei uma função "formato " para isso. Outra maneira é usar "quote_ident "função.
EXECUTE 'UPDATE ' || quote_ident(r.table_name) || 'SET ...