Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Tạo lặp lại PLSQL XML

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 đến

    xml_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 , WRITETOBUFFERWRITETOFILE 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tìm toàn bộ cây từ gốc cho bất kỳ nút nào

  2. Xóa hàng con và hàng mẹ bằng một tập lệnh SQL

  3. Làm thế nào tôi có thể nhận được số ngày giữa 2 ngày trong Oracle 11g?

  4. Tại sao Oracle.ManagedDataAccess không hoạt động khi Oracle.DataAccess hoạt động?

  5. Nhận dòng đầu tiên của THAM GIA NGOÀI TRÁI