Подстрока в поле CLOB

Мы пытаемся применить функцию подстроки в поле CLOB для обрезки первых 4000 символов. мы получаем следующее сообщение об ошибке.

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

select
cast(substr(field_name,1,4000) as varchar(4000))
from table_name;

Сообщение об ошибке:

Ошибка SQL: ORA-22835: буфер слишком мал для преобразования CLOB в CHAR или BLOB в RAW (фактический: 8000, максимум: 4000)
22835. 00000 - «Буфер слишком мал для преобразования CLOB в CHAR или BLOB в RAW (фактический :% s, максимум:% s) "
* Причина: Была сделана попытка преобразовать CLOB в CHAR или BLOB в RAW, где размер LOB был больше предела буфера для типов CHAR и RAW. Обратите внимание, что ширина указывается в символах, если для столбца действует семантика длины символа, в противном случае ширина указывается в байтах.
* Действие: Выполните одно из следующих действий 1. Уменьшите размер LOB перед выполнением преобразования, например, с помощью SUBSTR в CLOB 2. Используйте DBMS_LOB.SUBSTR для преобразования CLOB в CHAR или BLOB в RAW.


person Navin    schedule 18.10.2013    source источник
comment
Предложение 2 выглядит многообещающим.   -  person Dan Bracuk    schedule 18.10.2013


Ответы (3)


Альтернативно использование dbms_lob.substr:

dbms_lob.substr(clob_field_name, desired_size)

Не требует гипса.

person Vadzim    schedule 07.08.2015
comment
Согласно документации dbms_lob.substr () подсчитывает количество символов подстроки (а не ее размер в байтах). - person Christian4145; 19.01.2018
comment
Количество байтов (для BLOB) или символов (для CLOB) - person Vadzim; 19.01.2018

Предел для VARCHAR составляет 4000 байтов, а не символов. Если кодировка вашей базы данных является многобайтовой кодировкой, substr(field_name,1,4000) будет слишком длинным. (8000 в сообщении об ошибке предполагает, что каждый символ использует 2 байта, так что, возможно, UTF16?).

Пытаться :

select cast(substr(field_name,1,2000) as varchar(4000 byte))
from table_name;

Но имейте в виду, что 2000 символов могут занять более 4000 байтов (это зависит от набора символов вашей базы данных и текста, который вы кодируете).

person Nicolas    schedule 18.10.2013

Попробуйте эту функцию ниже. Это должно решить вашу проблему.

SELECT SUBSTR(xmltype(CLOBColumnname),4001,LENGTH(CLOBColumnname)) 
FROM TABLENAME;
person Teja    schedule 18.10.2013
comment
Пробовал SELECT xmltype (CLOBColumnName) FROM TABLENAME; Получена следующая ошибка: ORA-31011: сбой синтаксического анализа XML ORA-19202: Ошибка при обработке XML LPX-00210: ожидалось '‹' вместо 'T' Ошибка в строке 1 ORA-06512: в SYS.XMLTYPE, строка 301 ORA -06512: в строке 1 31011. 00000 - Ошибка синтаксического анализа XML * Причина: синтаксический анализатор XML возвратил ошибку при попытке проанализировать документ. * Действие: проверьте, действителен ли документ, который нужно проанализировать. - person Navin; 19.10.2013