powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сохранение содержимого BLOB в двоичный файл
6 сообщений из 6, страница 1 из 1
Сохранение содержимого BLOB в двоичный файл
    #32182266
Андрей И.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Люди, может быть, кто-то уже сталкивался с такой проблемой.
Требуется записать двоичную информацию из поля BLOB в файл средствами PL/SQL в Oracle 9.
Написал вот это:

f := UTL_FILE.FOPEN('h:\Temp', 'FileName.jpg', 'w', 32767);
n := 1; amount := 10000;
BEGIN
LOOP
DBMS_LOB.READ(vDoc.BLOB_Content, amount, n, buffer);
UTL_FILE.PUT_RAW(f, buffer);
n := n + amount;
END LOOP;
EXCEPTION WHEN NO_DATA_FOUND THEN
UTL_FILE.FCLOSE(f);
END;

По идее, все должно работать - тем более, что аналогичный пример я нашел на сайте ORACLE-BASE: http://www.oracle-base.com/Articles/9i/ExportBlob9i.asp

А оно не работает - на строчке с PUT_RAW возникает ошибка записи в файл ORA-29285. При этом, если я пытаюсь записывать не двоичные данные, а символьные строки с помощью UTL_FILE.PUT - все проходит "на ура". То есть, судя по всему, дело именно в формате данных.

Подскажите, что делать - полдня уже бьюсь...
...
Рейтинг: 0 / 0
Сохранение содержимого BLOB в двоичный файл
    #32182304
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
You are exceeding the max record length (32767). RTFM:

Код: plaintext
1.
2.
3.
4.
5.
6.
PUT_RAW Function
This function accepts as input a RAW data value and writes the value to the output buffer.
You can request an automatic flush of the buffer by setting the third argument to TRUE.

The maximum size of the buffer parameter is  32767  bytes unless you specify a smaller size in FOPEN.
The default is approximately  1000  bytes, depending on your platform.
The sum of all sequential PUT calls cannot exceed  32767  without intermediate buffer flushes.


Since you are using PUT_RAW without third parameter, you are not flushing and therefore LOB pieces you write are accumulating in UTL_FILE buffer. Eventually you exceed 32767.

SY
...
Рейтинг: 0 / 0
Сохранение содержимого BLOB в двоичный файл
    #32182343
Андрей И.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да нет, я уже пробовал вот так:
UTL_FILE.PUT_RAW(f, buffer, TRUE);

и даже вот так:
UTL_FILE.PUT_RAW(f, buffer);
UTL_FILE.FFLUSH(f);

Не помогает
...
Рейтинг: 0 / 0
Сохранение содержимого BLOB в двоичный файл
    #32182383
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Let me take it back. UTL_FILE still is a package to read and write operating system text files. So main restriction is still there: file is a stream file with NEW_LINE serving as record (line) separator. Max record size is whatever specified in FOPEN as parameter max_linesize and can not exceed 32767 (including new line). Below is an example:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SQL> DECLARE
   2   f UTL_FILE.FILE_TYPE := UTL_FILE.FOPEN('C:\TEMP', 'FileName.jpg', 'w',  32767 ); 
   3   buffer raw( 10000 ) := LPAD('A', 19999 ,'B') || 'A';
   4   BEGIN 
   5   UTL_FILE.PUT_RAW(f, buffer, TRUE); 
   6   UTL_FILE.PUT_RAW(f, buffer, TRUE); 
   7   UTL_FILE.PUT_RAW(f, buffer, TRUE); 
   8   UTL_FILE.FCLOSE(f); 
   9   END; 
  10   /

PL/SQL procedure successfully completed.


When total size does not exceed 32K, it works fine, but as soon as it exceeds 32K:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SQL> DECLARE
   2   f UTL_FILE.FILE_TYPE := UTL_FILE.FOPEN('C:\TEMP', 'FileName.jpg', 'w',  32767 ); 
   3   buffer raw( 10000 ) := LPAD('A', 19999 ,'B') || 'A';
   4   BEGIN 
   5   UTL_FILE.PUT_RAW(f, buffer, TRUE); 
   6   UTL_FILE.PUT_RAW(f, buffer, TRUE); 
   7   UTL_FILE.PUT_RAW(f, buffer, TRUE); 
   8   UTL_FILE.PUT_RAW(f, buffer, TRUE); 
   9   UTL_FILE.FCLOSE(f); 
  10   END; 
  11   /
DECLARE
*
ERROR at line  1 :
ORA- 29285 : file write error
ORA- 06512 : at  "SYS.UTL_FILE" , line  18 
ORA- 06512 : at  "SYS.UTL_FILE" , line  1007 
ORA- 06512 : at line  8 


It errors out. And when we add NEW_LINE after third PUT_RAW, we are OK again (however it is not what you are looking for since you are, as far as I see, creating a JPG which is a binary file and NEW_LINE will mess it up):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SQL> DECLARE
   2   f UTL_FILE.FILE_TYPE := UTL_FILE.FOPEN('C:\TEMP', 'FileName.jpg', 'w',  32767 ); 
   3   buffer raw( 10000 ) := LPAD('A', 19999 ,'B') || 'A';
   4   BEGIN 
   5   UTL_FILE.PUT_RAW(f, buffer, TRUE); 
   6   UTL_FILE.PUT_RAW(f, buffer, TRUE); 
   7   UTL_FILE.PUT_RAW(f, buffer, TRUE); 
   8   UTL_FILE.NEW_LINE(f);
   9   UTL_FILE.PUT_RAW(f, buffer, TRUE); 
  10   UTL_FILE.FCLOSE(f); 
  11   END; 
  12   /

PL/SQL procedure successfully completed.


As you can see, the best you can do is to create a JPG no longer than 32K. Otherwise you could use BFILEs.

SY
...
Рейтинг: 0 / 0
Сохранение содержимого BLOB в двоичный файл
    #32182905
Les
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
данные, на жабе. Я когда столкнулся с этой проблемой стал выгружать код символа - т.е. выгружаю просто текст, а уже на кленте собираю с помощью внешней програмки в двоичный - все работает, хотя и немного тормозной способ
...
Рейтинг: 0 / 0
Сохранение содержимого BLOB в двоичный файл
    #32182976
Андрей И.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так проблема-то в том, что у меня нет клиента - вернее, в роли клиента выступает броузер. Я пишу на PL/SQL WEB-приложение. Пользователь может, заполняя форму, прицепить к ней свой файл. Содержимое этого файла будет сохранено в BLOB-поле. Дальше, мне нужно прикрепить этот файл к отправляемому письму. А вот как это сделать, не сохраняя этот файл на диске - ума не приложу. И сохранить вот тоже не получается.
Может быть, кто-то находил уже выход из такого положения, чтобы мне велосипед-то не изобретать.
А где найти этот пример на Java?
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сохранение содержимого BLOB в двоичный файл
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]