Balasan yang benar adalah komentar dari Anton Kovalenko
Anda tidak dapat menggunakan variabel sebagai nama tabel atau kolom dalam SQL yang disematkan.
UPDATE dynamic_table_name SET ....
PostgreSQL menggunakan rencana yang disiapkan dan disimpan untuk SQL tertanam, dan referensi ke objek target (tabel) dalam dan dikodekan dengan keras dalam rencana - beberapa karakteristik memiliki dampak signifikan pada rencana - untuk satu tabel dapat digunakan indeks, untuk yang lain tidak. Perencanaan kueri relatif lambat, jadi PostgreSQL tidak mencobanya secara transparan (tanpa sedikit pengecualian).
Anda harus menggunakan SQL dinamis - satu tujuan digunakan untuk situasi serupa. Anda selalu membuat string SQL baru dan paket tidak disimpan
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 $$;
Perhatian:SQL Dinamis tidak aman (ada injeksi SQL risiko) tanpa sanitasi parameter. Saya menggunakan fungsi "format " untuk itu. Cara lain adalah menggunakan "quote_ident " fungsi.
EXECUTE 'UPDATE ' || quote_ident(r.table_name) || 'SET ...