Die grundlegende Abfrage zum dynamischen Erstellen des Befehls:
SELECT format('INSERT INTO %I (%I) SELECT %I FROM %I'
, tbl_des, col_des, col_src, tbl_src) As sql
FROM table3;
Dies erzeugt eine Abfrage wie:
INSERT INTO "Table2" (col2) SELECT col1 FROM "Table1"
Beachten Sie die zitierte Großschreibung. Anders als bei SQL-Befehlen, wo Bezeichner ohne Anführungszeichen automatisch in Kleinbuchstaben umgewandelt werden, wird bei den Zeichenfolgen in Ihrer Tabelle jetzt zwischen Groß- und Kleinschreibung unterschieden!
Ich empfehle Ihnen niemals Bezeichner in doppelte Anführungszeichen setzen und ausschließlich zulässige Namen in Kleinbuchstaben verwenden.
Automatisieren:
DO
$$BEGIN
EXECUTE (
SELECT format('INSERT INTO %I (%I) SELECT %I FROM %I'
, tbl_des, col_des, col_src, tbl_src) As sql
FROM table3
-- WHERE table3_id = 123 -- select only *one* row!
);
END$$;
Sie brauchen um den format()
Funktion. Lesen Sie das Handbuch
.
Sie können dies auch in eine plpgsql-Funktion packen und zusätzliche Parameter übergeben: