Không có lý do gì khi cố gắng tạo XML rất lớn trong PL / SQL. Vấn đề không phải là PL / SQL, mà là PL / SQL chỉ hỗ trợ XML DOM và DOM hoàn toàn không xử lý tốt XML lớn. Bạn không nói kích thước của tài liệu XML mà bạn có, nhưng tôi sẽ không ngạc nhiên khi thấy bộ nhớ đang được PL / SQL sử dụng để xây dựng tài liệu của bạn có kích thước gấp khoảng 10 đến 30 lần kích thước của tài liệu kết quả.
Có tùy chọn nào để tạo XML bằng cách sử dụng thứ gì đó khác ngoài PL / SQL không? Nếu không, và tôi thực sự phải tạo các tệp XML lớn trong cơ sở dữ liệu Oracle, tôi sẽ cân nhắc sử dụng các thủ tục được lưu trữ bằng Java. Câu hỏi này có một số câu trả lời về cách thực hiện loại điều này trong Java.
CHỈNH SỬA phản hồi lại nhận xét của bạn:mã của bạn chắc chắn không phải viết một dòng tại một thời điểm. Nó đang viết rất nhiều thứ cùng nhau, một sự thật mà tôi đã xác minh bằng cách chạy nó bằng cách sử dụng truy vấn SELECT * FROM all_objects
trên cơ sở dữ liệu Oracle 11g XE của tôi. Vòng lặp đã chạy một lần và ghi 7341 đối tượng, tạo ra một tệp XML có kích thước chỉ hơn 3MB.
Sau đó, tôi đã thử sửa đổi mã của bạn để hỗ trợ tốt hơn cách tiếp cận 'gia tăng' mà bạn mô tả. Điều này liên quan đến:
-
thêm một dòng
dbms_xmlgen.setmaxrows(ctx, max_rows);
để yêu cầu DBMS_XMLGEN chỉ tạo 5 hàng cùng một lúc. Nếu không, nó sẽ cố gắng tạo ra rất nhiều trong một lần. -
sửa đổi mã ở đầu
WHILE
vòng lặp đếnxml_result := dbms_xmlgen.getXML(ctx); num_rows_processed := DBMS_XMLGEN.GETNUMROWSPROCESSED(ctx); dbms_output.put_line('Got ' || num_rows_processed || ' rows processed'); while num_rows_processed > 0 -- rest of loop omitted
-
thêm dòng đầu tiên trong số ba dòng này ngay trước phần cuối của
WHILE
vòng lặp.
Sau đó, tôi chạy lại mã của bạn và tôi có thể thấy nó ghi từng lô năm hàng vào tệp mỗi lần. Tuy nhiên, có một vấn đề nhỏ với cách tiếp cận này, đó là tệp bị ghi đè mỗi lần. Cuối cùng, tôi chỉ có một bản ghi duy nhất trong tệp XML đầu ra. Tôi không thể tưởng tượng đây sẽ là những gì bạn muốn.
WRITETOCLOB
, WRITETOBUFFER
và WRITETOFILE
trong DBMS_XMLDOM
không gợi ý về khả năng thêm vào một tệp hiện có, và thành thật mà nói, tôi không ngạc nhiên khi họ không làm vậy. Nếu có thể, bạn sẽ nhận được XML không hợp lệ, vì sẽ có nhiều hơn một <?xml ... ?>
khai báo trong tệp.
Tôi đứng về lời khuyên trước đây của tôi. Bất cứ khi nào bạn cần xử lý XML lớn, trong cơ sở dữ liệu Oracle hoặc nơi khác, hãy sử dụng SAX hoặc StAX. PL / SQL cũng không hỗ trợ, vì vậy hãy làm bất cứ điều gì bạn cần làm trong các thủ tục được lưu trữ trên Java hoặc thực hiện nó từ cơ sở dữ liệu.