Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

BLOB -> Oracle [D7]


rar ©   (2010-03-18 12:10:00) 

Вопрос к знатокам.

Проблема с выполнением такой процедуры из ClientDataSet

Почему при:
ClientDataSet.CommandText='insert into MyTable values (:pBLOB)'
все вставляется нормально
, а при
ClientDataSet.CommandText=
'begin insert into MyTable values (:pBLOB); end;'
если BLOB больше 32K, то выдается ошибка:
ORA-01460 Unimplemented or unreasonable conversion required?

(в обоих случаях использовалось ClientDataSet.Parameters[0].LoadFromFile(Path,ftBlob))


Кщд   (2010-03-19 08:00:00) [1]


>Медвежонок Пятачок ©   (18.03.10 13:37) [5]
> даже если с клиента ничего не передавать, а последовательно
> делать конкатенацию блоб переменной прямо на сервере, то
> за пределы 32767 все равно не выпрыгнешь


SQL> declare
 2    v_amount pls_integer;
 3    v_buff   raw(32767);
 4    v_blob   blob;
 5  begin
 6  
 7    v_buff := utl_raw.cast_to_raw(lpad('Вставить более 32кБ в blob нельзя, ибо табу!', 32767, '!'));
 8    v_amount := utl_raw.length(v_buff);
 9  
10    dbms_output.put_line('Размер буфера: ' || v_amount);
11  
12    dbms_lob.createtemporary(v_blob, true, dbms_lob.session);
13    dbms_lob.open(v_blob, dbms_lob.lob_readwrite);
14    for i in 1..100
15    loop
16      dbms_lob.writeappend(v_blob, v_amount, v_buff);
17    end loop;
18  
19    dbms_output.put_line('Размер полученного blob: ' || dbms_lob.getlength(v_blob));
20  
21    dbms_lob.close(v_blob);
22    dbms_lob.freetemporary(v_blob);
23  
24  exception
25    -- oops! something happened! alarm!
26    when others then
27      dbms_output.put_line(sqlerrm);
28  end;
29  /

Размер буфера: 32767
Размер полученного blob: 3276700

PL/SQL procedure successfully completed

Что я делаю не так?


Игорь Шевченко   (2010-03-18 19:25:00) [2]

через dbms_lob не поможет ?


rar   (2010-03-18 13:45:00) [3]

попробуй выставить Param.DataType и ParamType явно

установил ftBlob и соответственно ptInput

не помогло

Жаль похоже придется писать через Insert а потом  далее обрабатывать.

Всем спасибо.


Медвежонок Пятачок   (2010-03-18 13:37:00) [4]

думаю не поможет ибо тип есть тип и у него есть ограничения.
даже если с клиента ничего не передавать, а последовательно делать конкатенацию блоб переменной прямо на сервере, то за пределы 32767 все равно не выпрыгнешь


Правильный$Вася   (2010-03-18 13:24:00) [5]

попробуй выставить Param.DataType и ParamType явно


rar   (2010-03-18 12:44:00) [6]

что в блок pl/sql нельзя передать более 32k? И решения нет?


rar   (2010-03-18 12:37:00) [7]

Правильный$Вася ну и где решение?


Правильный$Вася   (2010-03-18 12:35:00) [8]

потому что типы данных в SQL и PL/SQL слегкка отличаются


Наверх

Титульная страница Поиск, карта сайта Написать письмо