-
Đăng phiên bản Oracle mà bạn đang sử dụng! Hoặc chúng ta chỉ có thể đoán xung quanh ...
-
fflush
của bạn sẽ không hoạt động như bạn mong đợi - Từ tài liệu :FFLUSH vật lý ghi dữ liệu đang chờ xử lý vào tệp được xác định bởi trình xử lý tệp. Thông thường, dữ liệu được ghi vào tệp được lưu vào bộ đệm. Quy trình FFLUSH buộc dữ liệu được lưu trong bộ đệm phải được ghi vào tệp. Dữ liệu phải được kết thúc bằng ký tự dòng mới.
-
tbone hoàn toàn đúng, dòng TO_CHAR (10) là sai! Chỉ cần thử
SELECT TO_CHAR(10) FROM DUAL;
bạn sẽ nhận được10
mà sau đó bạn so sánh với một ký tự. Một ký tự sẽ không bao giờ là '10' vì 10 có hai ký tự! -
Vấn đề của bạn rất có thể là tràn bộ đệm với các Tệp XML quá lớn, nhưng hãy lưu ý, các vấn đề khác trên hệ thống đích cũng có thể dẫn đến lỗi write_errors, cần được xử lý.
Giải pháp
-
Nhanh &Bẩn :Vì bạn dường như không quan tâm đến hiệu suất, bạn có thể chỉ cần đóng tệp mỗi byte X và mở lại nó bằng A để thêm vào. Vì vậy, chỉ cần thêm vào vòng lặp:
IF MOD( l_offset, 32000 ) = 0 THEN UTL_FILE.FCLOSE( f_out ); UTL_FILE.FOPEN( out_fpath, out_fname, f_out, 'a', 32767 ); END IF;
-
Sử dụng đúng công cụ cho đúng công việc:
UTL_FILE
không thích hợp để xử lý dữ liệu phức tạp. Usecase duy nhất cho UTL_FILE là các dòng văn bản nhỏ được phân tách bằng dòng mới. Đối với mọi thứ khác, bạn nên viết byte RAW! (Điều này cũng sẽ cho phép bạn kiểm soát khuân vác đối với ENCODING, hiện chỉ là trò đoán may rủi nhỏ) -
Viết một Java-Stored-Procedure với NIO-Filechannels - nhanh, an toàn, đẹp ... Nhưng hãy cẩn thận, chương trình của bạn có thể chạy nhanh gấp 10 lần!