Как я могу избежать слишком длинных ошибок необработанной переменной длины в SQL Developer?

Я обновляю BLOB с большим количеством текста и получаю эту ошибку:

SQL Error: ORA-06502: PL/SQL: numeric or value error: raw variable length too long

Есть ли способ обойти это?

Текст имеет длину 2670 символов и преобразуется с помощью utl_i18n.string_to_raw, как описано в sql-developer">Как редактировать большие двоичные объекты (содержащие JSON) в Oracle SQL Developer?, и все это находится в одной строке запроса.

Обновление: рассматриваемый BLOB уже содержит текст длиной 2686 символов, что длиннее, чем текст, который я пытаюсь вставить.


person Xonatron    schedule 16.03.2012    source источник
comment
возможный дубликат Как редактировать большие двоичные объекты (содержащие JSON) в Oracle SQL Developer?   -  person Justin Cave    schedule 16.03.2012
comment
Я обновил свой ответ в другом потоке, включив в него несколько более сложный подход, более гибкий, чем использование функции utl_i18n.string_to_raw.   -  person Justin Cave    schedule 16.03.2012


Ответы (2)


RAW ограничен 2000 байтами. Если ваши данные длиннее, вам нужно сохранить их в CLOB, а затем преобразовать CLOB в BLOB, что, к сожалению, немного сложнее, чем функция string_to_raw. Что-то вроде этого будет работать, если вы можете назначить всю строку переменной CLOB, которая должна работать, пока длина строки меньше 32676 байт. Если он длиннее, вам нужно будет записать CLOB по частям, а затем преобразовать в BLOB.

declare
  l_blob        blob;
  l_clob        clob := rpad('{"foo": {"id": "1", "value": "2", "name": "bob"}}',3200,'*');
  l_amt         integer := dbms_lob.lobmaxsize;
  l_dest_offset integer := 1;
  l_src_offset  integer := 1;
  l_csid        integer := dbms_lob.default_csid;
  l_ctx         integer := dbms_lob.default_lang_ctx;
  l_warn        integer;
begin
  dbms_lob.createTemporary( l_blob, false );
  dbms_lob.convertToBlob( l_blob,
                          l_clob,
                          l_amt,
                          l_dest_offset,
                          l_src_offset,
                          l_csid,
                          l_ctx,
                          l_warn );
  update json_data
     set data = l_blob;
end;
/
person Justin Cave    schedule 16.03.2012
comment
Это работает, но почему rpad? Мне нужно установить длину rpad на длину строки, которую я вставляю. Есть ли способ сделать это, не используя rpad? - person Xonatron; 16.03.2012
comment
@MatthewDoucette - вам вообще не нужно использовать RPAD. Я просто использовал его в своем примере для создания строки из 3200 символов, потому что мне лень вводить такую ​​длинную строку, и было бы сложно форматировать такую ​​строку в сообщении SO. - person Justin Cave; 16.03.2012
comment
А, я понимаю. Большое спасибо. Потрясающая помощь! - person Xonatron; 16.03.2012

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

person Sachin Kainth    schedule 16.03.2012
comment
Уверены ли вы? BLOB уже содержит текст, который больше, чем текст, который я пытаюсь вставить. Для меня это проблема с SQL Developer (интерфейсом), а не с базой данных. - person Xonatron; 16.03.2012
comment
Это может быть связано с максимальным лимитом utl_i18n.string_to_raw, если он есть. - person Xonatron; 16.03.2012