![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 слегкка отличаются