2016-01-08 3 views
2

Я хотел бы использовать максимум 4000 символов для , помещенных в максимальное поле 4000 байтов (парадоксально, что 4000 байтов - это ограничение даже для введения в заблуждение полей VARCHAR2 (4000 CHAR) в Oracle 11).Как взять самую длинную строку, которая поместится в VARCHAR2 (4000) из NCLOB?

альтернативы я вижу, являются:

  • substr(NCLOB_COLUMN, 1, 4000) - нет хороших, 4000 символов часто не может быть больше 4000 байт
  • dbms_lob.substr(NCLOB_COLUMN, 4000, 1) - нет хороших, 4000 символов часто не может быть больше 4000 байт (см также How to Copy Only First 4000 Characters from Oracle NCLOB to NVARCHAR2(4000) Value?)

  • substr(NCLOB_COLUMN, 1, 1000) - не хорошо, я обычно можно получить гораздо больше, чем 1000 символов

  • substrb(NCLOB_COLUMN, 1, 4000) - не подходит, генерирует ORA-22998 error

Другие идеи?

ответ

2

Предположительно, вы не хотите иметь частичный характер - например, первый байт многобайтовома характера - чтобы вы могли получить первые 4000 символов (которые могут быть больше, чем 4000 байт), а затем несколько раз содрать последнюю, пока число байт не достигнет 4000 или более низкий:

create or replace function nclob_4k(p_nclob in nclob) 
return varchar2 
as 
    l_varchar2 varchar2(32767); 
begin 
    l_varchar2 := dbms_lob.substr(p_nclob, 4000, 1); 
    while lengthb(l_varchar2) > 4000 loop 
    l_varchar2 := substr(l_varchar2, 1, length(l_varchar2) - 1); 
    end loop; 
    return l_varchar2; 
end; 
/

Затем вы можете выбрать nclob_4k(your_nclob_column) из своей таблицы или использовать его для вставки.

+0

Как вы измените это для Oracle 11? Я считаю, что 32767 не будет работать. –

+1

Я протестировал это в 11gR2. «Varchar2 (32767)» ОК в PL/SQL, и я всегда думал; это ограничение SQL, которое увеличилось с 4000 до 32k в 12c. Однако я использовал поддельные данные, заставляя многобайтовых символов вокруг знака 4k, чтобы убедиться, что он справился; тестирование с вашими реальными данными может что-то бросить. (И я уверен, что вы можете придумать лучшее имя для этой функции!) –

 Смежные вопросы

  • Нет связанных вопросов^_^