Конференция "Базы" » BLOB -> Oracle [D7]
 
  • rar (18.03.10 12:10) [0]
    Вопрос к знатокам.

    Проблема с выполнением такой процедуры из 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))
  • Правильный$Вася (18.03.10 12:35) [1]
    потому что типы данных в SQL и PL/SQL слегкка отличаются
  • rar (18.03.10 12:37) [2]
    Правильный$Вася ну и где решение?
  • rar (18.03.10 12:44) [3]
    что в блок pl/sql нельзя передать более 32k? И решения нет?
  • Правильный$Вася (18.03.10 13:24) [4]
    попробуй выставить Param.DataType и ParamType явно
  • Медвежонок Пятачок © (18.03.10 13:37) [5]
    думаю не поможет ибо тип есть тип и у него есть ограничения.
    даже если с клиента ничего не передавать, а последовательно делать конкатенацию блоб переменной прямо на сервере, то за пределы 32767 все равно не выпрыгнешь
  • rar (18.03.10 13:45) [6]
    попробуй выставить Param.DataType и ParamType явно

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

    не помогло

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

    Всем спасибо.
  • Игорь Шевченко © (18.03.10 19:25) [7]
    через dbms_lob не поможет ?
  • Кщд (19.03.10 08:00) [8]

    >Медвежонок Пятачок ©   (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


    Что я делаю не так?
 
Конференция "Базы" » BLOB -> Oracle [D7]
Есть новые Нет новых   [134432   +19][b:0.001][p:0.002]