2011-08-26 30 views
5

Tôi đang viết một tệp lớn> 7MB từ quy trình được lưu trữ của Oracle và các yêu cầu không có ký tự chấm dứt dòng (không có dòng trả lại dòng/dòng) ở cuối mỗi bản ghi.Oracle PL/SQL UTL_FILE.PUT đệm

Tôi đã viết một quy trình được lưu trữ sử dụng UTL_FILE.PUT và tôi đang theo từng cuộc gọi đến UTL_FILE.PUT với một UTL_FILE.FFLUSH. Thủ tục này lỗi với một lỗi viết một khi tôi nhận được đến điểm mà tôi đã viết nhiều hơn kích thước bộ đệm (thiết lập để tối đa 32767) mặc dù tôi đang thực hiện các cuộc gọi FFLUSH. Quy trình hoạt động tốt nếu tôi thay thế cuộc gọi PUT bằng lệnh gọi PUT_LINE.

Không thể viết nhiều hơn kích thước bộ đệm mà không có ký tự mới? Nếu vậy, có một công việc xung quanh?

Trả lời

3

Dustin,

Các Oracle tài liệu ở đây: http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/u_file.htm#i1003404

Hoa rằng: fflush chất ghi dữ liệu cấp phát đến tập tin xác định bởi các tập tin xử lý. Thông thường, dữ liệu được ghi vào một tập tin được đệm. Thủ tục FFLUSH buộc dữ liệu đệm được ghi vào tệp. Dữ liệu phải được chấm dứt bằng ký tự dòng mới.

Câu cuối cùng là phù hợp nhất.

Bạn không thể ghi dữ liệu bằng cách sử dụng UTL_FILE.PUT_LINE trước khi tìm kiếm tệp kết quả cho thuật ngữ dòng và xóa chúng?

Chỉ cần một ý nghĩ ....

+0

Cảm ơn bạn đã làm rõ cách FFLUSH hoạt động, tôi không thấy câu cuối cùng trong tìm kiếm của tôi. – Dustin

+0

Hi @Ollie, tôi vẫn còn bối rối về cách FFLUSH hoạt động, cho (1 -> 32767 + n), mỗi lần tôi đặt, và tôi fflush. Tại sao một dòng mới vẫn cần thiết? Bạn sẽ giúp giải thích? – Jaskey

4

xóa trích dẫn từ tài liệu, xem Ollie của câu trả lời

Một cách khác có thể làm điều này là một thủ tục lưu trữ Java, nơi bạn có thể sử dụng các chi tiết đầy đủ tính năng Java API để tạo và ghi vào các tệp.

+0

ý tưởng hay với thủ tục lưu sẵn Java +1 – Ollie

+0

Tôi bị hấp dẫn bởi thủ tục lưu sẵn java.Mặc dù tôi tin rằng mã Java chính nó sẽ được đơn giản, chúng tôi không làm bất kỳ mã java trong cửa hàng của chúng tôi, vì vậy nó sẽ là một vấn đề bảo trì cho một người nào đó phải nhận. – Dustin

+0

Bạn vui lòng giúp giải thích cách chúng tôi có thể giải quyết vấn đề này với đối tượng BFILE? – Jaskey

0

Mặc dù nó ít hơn mong muốn, bạn luôn có thể PUT cho đến khi bạn phát hiện ra rằng bạn đang ở gần kích thước bộ đệm. Khi điều này xảy ra, bạn có thể FCLOSE xử lý tệp (xóa bộ đệm) và mở lại cùng một tệp đó với FOPEN sử dụng 'a' (nối thêm) làm chế độ. Một lần nữa, kỹ thuật này nói chung nên tránh, đặc biệt là nếu các quá trình khác cũng đang cố gắng truy cập tệp (ví dụ: đóng tệp thường thu hồi bất kỳ khóa nào mà quá trình đã đặt, giải phóng bất kỳ quy trình nào khác đang cố gắng lấy khóa).

0

Cảm ơn tất cả các phản hồi tuyệt vời, chúng rất hữu ích. Các thủ tục lưu trữ java trông giống như con đường để đi, nhưng kể từ khi chúng tôi không có rất nhiều chuyên gia java trong nhà, nó sẽ được tán thành bởi quản lý. Nhưng, tôi đã có thể tìm cách để làm điều này từ thủ tục lưu sẵn. Tôi đã phải mở tập tin trong chế độ ghi byte 'WB'. Sau đó, đối với mỗi bản ghi tôi đang ghi vào tệp, tôi chuyển đổi nó thành kiểu dữ liệu RAW với UTL_RAW.CAST_TO_RAW. Sau đó sử dụng UTL_FILE.PUT_RAW để ghi vào tập tin theo sau bởi bất kỳ cuộc gọi FFLUSH cần thiết nào để xóa bộ đệm. Hệ thống nhận đã có thể đọc các tập tin; càng xa càng tốt.

Các vấn đề liên quan