Tôi đang nhập một số lượng lớn các tệp lớn vào một số bảng để được phân vùng bằng các vòng lặp trong một khối mã plpgsql ẩn danh $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
Toàn bộ quá trình này sẽ mất khoảng 15 giờ và tôi hy vọng rằng tất cả các lần nhập sẽ không được khôi phục nếu có lỗi nhập vào một lúc nào đó.
IIRC COMMIT
không hoạt động trong các chức năng được lưu trữ bc, toàn bộ chức năng được coi là một giao dịch.
Khối mã được xử lý như thể nó là phần thân của hàm không có tham số, trả về khoảng trống. Nó được phân tích cú pháp và thực hiện một lần duy nhất.
Tôi cho rằng điều này có nghĩa là toàn bộ $do$
là một giao dịch và do đó, các cam kết trong khối sẽ không hoạt động. Tôi có đúng không?
BEGIN
hoặcCOMMIT
trong cơ thể chức năng. Bạn sẽ có một ngoại lệ, vì điều đó không được phép (không thể).