Saya mengimpor sejumlah besar file besar ke sejumlah tabel untuk dipartisi menggunakan loop dalam blok kode plpgsql anonim $do$
.
$do$
BEGIN
FOR yyyy in 2012..2016 THEN
EXECUTE $$COPY table$$||yyyy||$$ FROM 'E:\data\file$$||yyyy||$$.csv DELIMITER ',' CSV;$$;
END LOOP;
END;
$do$ LANGUAGE plpgsql
Seluruh proses ini akan memakan waktu sekitar 15 jam dan saya berharap bahwa semua impor tidak akan dibatalkan jika ada kesalahan impor di beberapa titik.
IIRC COMMIT
tidak berfungsi dalam fungsi tersimpan bc seluruh fungsi diperlakukan sebagai satu transaksi.
Blok kode diperlakukan seolah-olah itu adalah tubuh fungsi tanpa parameter, mengembalikan batal. Itu diurai dan dieksekusi satu kali.
Saya mengasumsikan ini berarti bahwa keseluruhan $do$
adalah satu transaksi, dan jadi komitmen di dalam blok tidak akan berfungsi. Apakah saya benar?
BEGIN
atauCOMMIT
di tubuh fungsi. Anda akan mendapatkan pengecualian, karena itu tidak diizinkan (tidak mungkin).