sql >> Database >  >> RDS >> PostgreSQL

Hoe te selecteren uit een variabele die een tabelnaam is n Postgre>=9.2

Het juiste antwoord is een opmerking van Anton Kovalenko

U kunt nooit een variabele als tabel- of kolomnaam in embedded SQL gebruiken.

UPDATE dynamic_table_name SET ....

PostgreSQL maakt gebruik van voorbereide en opgeslagen plannen voor embedded SQL, en verwijzingen naar een doelobject (tabellen) zijn diep en hard gecodeerd in plannen - sommige kenmerken hebben een aanzienlijke impact op plannen - voor de ene tabel kan de index worden gebruikt, voor de andere niet. Queryplanning is relatief traag, dus PostgreSQL probeert het niet transparant (zonder enkele uitzonderingen).

U moet een dynamische SQL . gebruiken - een enkel doel wordt gebruikt voor vergelijkbare situaties. U genereert altijd een nieuwe SQL-string en plannen worden niet opgeslagen

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 $$;

Let op:Dynamische SQL is onveilig (er is een SQL-injectie risico's) zonder parametrering. Ik gebruikte een functie "format " ervoor. Een andere manier is het gebruik van "quote_ident " functie.

EXECUTE 'UPDATE ' || quote_ident(r.table_name) || 'SET ...



  1. Mysql-tijdzone op Windows 7 niet bijgewerkt

  2. De datum ophalen uit een Datetime-kolom in MySQL

  3. Reset cursorpositie in PDO

  4. SQLPlus - spoolen naar meerdere bestanden van PL/SQL-blokken