Я немного поэкспериментировал с clobs и varchar2. Дело в том, что у нас много XML в таблице базы данных, и я хотел загрузить XML как можно быстрее. Поскольку мне нужно использовать компоненты C # DevArt, я пробовал это разными способами и обнаружил, что clobs (они включают одно обращение к базе данных на строку) намного медленнее, чем varchar2.
Таким образом, сейчас я загружаю данные в два этапа. Сначала столько, сколько я могу, как varchar2 (предел 4000 байт), а затем все остальное как clob.
Теперь самое сложное. Я придумал следующий запрос, чтобы узнать, что я могу получить как varchar2:
select c.xml.getstringval() from customers c where
length(t.xml.getclobval()) = length(dbms_lob.substr(c.xml.getclobval(), 4000, 1))
Запрос основан на предположении, что length возвращает количество символов для clobs, а substr возвращает строку с определенным количеством байтов. Это не работает только с длиной, потому что тогда у меня возникают проблемы с многобайтовыми символами, такими как à é oder è. Но теперь у меня другое очень странное поведение. Приведенный выше запрос работает для большинства строк, но для некоторых из них по-прежнему выдается ORA-06502. Но если я изменю лимит на 3992, он всегда работает ??? (в качестве информации мы также сохраняем эскиз изображения в виде строки в кодировке Base64 в xml).
Кто-нибудь теперь, почему запрос не работает во всех случаях. Или у кого-нибудь есть предложение, как написать запрос, который выясняет, можно ли получить clob как varchar2?