Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.10.2010, 11:23
eldaeron eldaeron вне форума
Прохожий
 
Регистрация: 05.05.2008
Сообщения: 15
Репутация: 10
По умолчанию сохранение blob в таблицу

добрый день!
вопрос к хорошо знающим оракл.
в двух словах, я передаю файл кусочками по 32к из приложения в хранимую процедуру оракла. файл принимается и сохраняется.
принимает и сохраняет его следующая процедура:
(в базе есть запись с id 1 и полем ORIG_FILE типа blob = null)
Код:
procedure dbst_save_lob( 
  id in number
 ,blb in blob
) is
  bl blob;
  len     BINARY_INTEGER;
begin
 select ORIG_FILE into bl from test_lob_2 where ID=1 for update;
 --prog_debug_info_save(length(bl));
 if bl is null then 
   begin
     update test_lob_2 set ORIG_FILE=blb where ID=1;
   end;
 else
   begin
     len := length(blb);
     dbms_lob.writeappend(bl, len, blb);
     update test_lob_2 set ORIG_FILE=blb where ID=1;
   end;
 end if;
end;
вроде все работает, но есть одно но, слишком долго. можно ли как нибудь избежать постоянного select'а и update'а?
в том плане чтоб как то складировать это в какую нибудь переменную и update делать только в самом конце?
Ответить с цитированием
  #2  
Старый 12.10.2010, 14:29
eldaeron eldaeron вне форума
Прохожий
 
Регистрация: 05.05.2008
Сообщения: 15
Репутация: 10
По умолчанию

все, вроде как работает...
вобщем сделал так
Код:
procedure dbst_save_lob( 
  id in number
 ,blb in blob
) is
  len     BINARY_INTEGER;
begin
  if loc is null then 
    begin
      update test_lob set ORIG_FILE=EMPTY_BLOB (); 
      select ORIG_FILE into loc from test_lob where TEST_ID=1 for update;
      --prog_debug_info_save('старт');
    end;
  end if;  
  if loc is not null then
    begin 
      len := length(blb);
      if len<>32000 then
        begin
          dbms_lob.writeappend(loc, len, blb);
          update test_lob set ORIG_FILE=loc where TEST_ID=1;
          --prog_debug_info_save('финиш');
        end;
      else
        dbms_lob.writeappend(loc, len, blb);
      end if;  
    end;
  end if;
end;
loc это глобальная пакетная переменная - локатор, ставится в null при записи нового файла. и пока надцать раз вызывается процедура не меняется. в итоге всего один селект чтоб инициализировать локатор и всего один update при получении последней части файла. есть конечно одно но, вполне возможно, что когда нибудь, кто нибудь, попытается залить файл, размер которого будет кратен 32000 байт... вот тут то кривые руки и всплывут)) надо еще подумать...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:06.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025