Как избежать ошибок «слишком длинная переменная длина» в SQL Developer? - PullRequest
8 голосов
/ 16 марта 2012

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

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

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

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

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

Ответы [ 2 ]

7 голосов
/ 16 марта 2012

A 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;
/
0 голосов
/ 16 марта 2012

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

...