La réponse correcte est un commentaire d'Anton Kovalenko
Vous ne pouvez jamais utiliser de variable comme nom de table ou de colonne dans Embedded SQL.
UPDATE dynamic_table_name SET ....
PostgreSQL utilise des plans préparés et enregistrés pour Embedded SQL, et les références à des objets cibles (tables) sont codées en profondeur et en dur dans les plans - certaines caractéristiques ont un impact significatif sur les plans - pour une table peut être utilisée comme index, pour d'autres pas. La planification des requêtes est relativement lente, donc PostgreSQL ne l'essaie pas de manière transparente (à quelques exceptions près).
Vous devez utiliser un SQL dynamique - un seul but est utilisé pour des situations similaires. Vous générez toujours une nouvelle chaîne SQL et les plans ne sont pas enregistrés
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 $$;
Attention :SQL dynamique est non sécurisé (il y a une injection SQL risques) sans assainissement des paramètres. J'ai utilisé une fonction "format " pour cela. Une autre façon est d'utiliser "quote_ident " fonction.
EXECUTE 'UPDATE ' || quote_ident(r.table_name) || 'SET ...