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

Giải nén Oracle BLOB rất chậm

Tôi khá chắc rằng bạn không nên tìm nạp tất cả BLOB vào một mảng khi bắt đầu quy trình. Vì bạn đọc dữ liệu BLOB và không bao giờ thực sự đóng bất kỳ bộ định vị lob nào, nên Oracle phải giữ tất cả thông tin này trong bộ nhớ. Tôi đoán đây là trường hợp quá tải bộ nhớ.

Hãy thử cái này thay thế:

CURSOR cc IS (SELECT ...)
BEGIN
   OPEN cc;
   LOOP
      FETCH cc
         INTO l_fname, l_blob;
      EXIT WHEN cc%NOTFOUND;
      l_blob_len := DBMS_LOB.getlength(l_blob);
      DBMS_OUTPUT.PUT_LINE(l_blob_len);
      l_file := UTL_FILE.fopen('BLOBS', l_x || '_' || l_fname, 'w', 32767);
      l_pos  := 1;
      l_x    := l_x + 1;
      WHILE l_pos < l_blob_len LOOP
         DBMS_LOB.READ(l_blob, l_amount, l_pos, l_buffer);
         UTL_FILE.put_raw(l_file, l_buffer, TRUE);
         l_pos := l_pos + l_amount;
      END LOOP;
      UTL_FILE.fclose(l_file);
   END LOOP;
   CLOSE cc;
END;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn SQL để tìm nạp OrderID, transactionID, Trạng thái dựa trên trạng thái giao dịch là Char

  2. Nhập tệp XML trong Kho lưu trữ DB XML của Oracle

  3. Con trỏ lồng nhau trong một con trỏ

  4. Làm cách nào để tắt hết hạn mật khẩu Oracle?

  5. Có bất kỳ cam kết tự động nào xảy ra sau khi thực hiện các thủ tục được lưu trữ trong oracle không?