Oracle
 sql >> база данни >  >> RDS >> Oracle

Извличането на Oracle BLOB е много бавно

Почти съм сигурен, че не трябва да извличате всички BLOB в масив в началото на процедурата. Тъй като четете BLOB данните и никога не затваряте лоб локатор, Oracle трябва да пази цялата тази информация в паметта. Предполагам, че това е случай на препълване на паметта.

Опитайте това вместо това:

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. Как да задам изчакване за анонимен блок или заявка в plsql?

  2. Как да използвам WebDev.WebServer.exe (VS уеб сървър) в x64?

  3. Oracle SQL SELECT DATE от полето DATETIME

  4. Функция ROWIDTOCHAR() в Oracle

  5. Oracle 10 оптимизатор от RULE към COST:защо?