Ошибка исходит от utl_file.put_raw
.
Максимальный размер параметра буфера составляет 32767 байт.
Вы проверяете на IF len < 32760 THEN
, однако я не вижу гарантии в вашем коде, что переменная len
фактически содержит длину переменной vblob
, которая является буфером в вызове put_raw
.
Так что я предполагаю, что фактическая длина переменной vblob
больше 32767, и это является причиной ошибки.
Поэтому я предлагаю удалить этот кусок кода:
IF len < 32760 THEN
-- dbms_output.put_line('Single write ');
utl_file.Put_raw(l_output, vblob);
utl_file.Fflush(l_output);
ELSE
также, конечно, END IF;
, и всегда используйте ветку «писать по частям».
Теперь я вижу, вы сделали это на основе примера Бурлсона, который хорош http://www.dba -oracle.com / t_writing_blob_clob_os_file.htm
но вы видите, в отличие от вас, Бурлесон получает переменную len и переменную vblob из той же таблицы и того же поля.
-- get length of blob
SELECT dbms_lob.getlength(productblob)
INTO len
FROM products
WHERE id = product_id;
-- save blob length
x := len;
-- select blob into variable
SELECT product_blob
INTO vblob
FROM products
WHERE id = product_id;
РЕДАКТИРОВАТЬ
Так что другой вариант - исправить выбор для получения длины. Это означает, что вам придется заменить этот выбор:
-- get length of blob
SELECT dbms_lob.Getlength(FILENAME)
INTO len
FROM GENERAL.GUBFILE
WHERE gubfile_name = pfname;
с этим:
-- get length of blob
SELECT dbms_lob.Getlength(BLOBVALUE)
INTO len
FROM FILES
WHERE filename = pfname;