Podstawowe zapytanie do dynamicznego zbudowania polecenia:
SELECT format('INSERT INTO %I (%I) SELECT %I FROM %I'
, tbl_des, col_des, col_src, tbl_src) As sql
FROM table3;
Daje to zapytanie takie jak:
INSERT INTO "Table2" (col2) SELECT col1 FROM "Table1"
Zwróć uwagę na cytowaną pisownię wielkimi literami. W przeciwieństwie do poleceń SQL, gdzie identyfikatory bez cudzysłowów są automatycznie zamieniane na małe litery, łańcuchy w tabeli są teraz rozróżniane!
Proponuję nigdy podwójnego cudzysłowu identyfikatorów i używaj wyłącznie legalnych nazw pisanych małymi literami.
Aby zautomatyzować:
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$$;
potrzebujesz zrozumieć format()
funkcjonować. Przeczytaj instrukcję
.
Możesz również zapakować to do funkcji plpgsql i przekazać dodatkowe parametry: