Ошибка: ORA-01704: слишком длинный строковый литерал

Хотя я пытаюсь установить значение более 4000 символов в поле, которое имеет тип данных CLOB, это дает мне эту ошибку:

ORA-01704: слишком длинный строковый литерал.

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

Примечание. Длинная строка, которую я пытаюсь сохранить, закодирована в ANSI.

8 ответов

Решение

Что вы используете, когда работаете с CLOB?

Во всех случаях вы можете сделать это с PL/SQL

DECLARE
  str varchar2(32767);
BEGIN
  str := 'Very-very-...-very-very-very-very-very-very long string value';
  update t1 set col1 = str;
END;
/

Пробная ссылка на SQLFiddle

Попробуйте разбить символы на несколько частей, как показано в запросе ниже, и попробуйте:

Insert into table (clob_column) values ( to_clob( 'chunk 1' ) || to_clob( 'chunk 2' ) );

Это сработало для меня.

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

DECLARE
  chunk1 CLOB; chunk2 CLOB; chunk3 CLOB;
BEGIN
  chunk1 := 'very long literal part 1';
  chunk2 := 'very long literal part 2';
  chunk3 := 'very long literal part 3';

  INSERT INTO table (MY_CLOB)
  SELECT ( chunk1 || chunk2 || chunk3 ) FROM dual;
END;

Надеюсь это поможет.

Сплит работает до 4000 символов в зависимости от символов, которые вы вставляете. Если вы вставляете специальные символы, это может дать сбой. Единственный безопасный способ - объявить переменную.

Хотя это очень старый вопрос, но я думаю, что обмен опытом может помочь другим:

Большой текст можно сохранить в одном запросе, если мы разобьем его на куски по 4000 байт/символов, объединив их с помощью '||'

Выполнение следующего запроса скажет вам:

  1. Требуемое количество чанков, содержащих 4000 байт
  2. Оставшиеся байты

Поскольку в данном примере вы пытаетесь сохранить текст размером 15000 байт (символов), то

      select 15000/4000 chunk,mod(15000,4000) remaining_bytes from dual;

Результат:

Это означает, что вам нужно объединить 3 фрагмента по 4000 байт и один фрагмент по 3000 байт, так что это будет выглядеть так:

      INSERT INTO <YOUR_TABLE> 
VALUES (TO_CLOB('<1st_4K_bytes>') || 
        TO_CLOB('<2nd_4K_bytes>') || 
        TO_CLOB('<3rd_4K_bytes>') || 
        TO_CLOB('<last_3K_bytes>)');
  1. создать функцию, которая возвращает clob
      create  function  ret_long_chars return clob is
begin

 return to_clob('put here long characters');

end; 
      update table set column = ret_long_chars;
INSERT INTO table(clob_column) SELECT TO_CLOB(q'[chunk1]') || TO_CLOB(q'[chunk2]') ||
            TO_CLOB(q'[chunk3]') || TO_CLOB(q'[chunk4]') FROM DUAL;

Принятый ответ не сработал для меня в sql-разработчике, но сработала комбинация этого ответа и другого:

      DECLARE
  str varchar2(32767);
BEGIN
  update table set column = to_clob('Very-very-...-very-very-very-very-very-very long string value')
/
Другие вопросы по тегам