Я пытаюсь использовать CLOB в Pro-C, но почти независимо от того, что я пытаюсь использовать для типа данных буфера, препроцессор говорит мне, что он не совместим.
Сообщение
PCC-S-02428, Buffer type is incompatible with LOB type,
и это на строке, которая гласит:
EXEC SQL LOB READ :amount FROM :clob into :buffer;
Этот код — моя попытка изменить код, который работает с BLOB, чтобы вместо этого работать с CLOB. Я изменил объявление локатора с OCIBlobLocator на OCIClobLocator, а затем выбил себе мозги, пытаясь выяснить, что мне нужно для объявления буфера как (неподписанный буфер символов [BUFFSIZ] работал для BLOB).
Как сейчас сидит:
Clob объявляется следующим образом:
OCIClobLocator *clob;
и буфер это:
#define BUFFSIZ 1000000
unsigned char buffer[ BUFFSIZ ];
Я пробовал char, int, double, long. ulong_varchar, short, utext, uvarchar, varchar в различных комбинациях указателей (например, short * buffer), объявления размерного массива, прямые объявления (например, буфер uvarchar), а также подписанные и неподписанные. Во всех случаях, когда объявление буфера само по себе допустимо, инструкция READ INTO не может скомпилироваться с этим сообщением.
На самом деле ввод текста сообщения в Google приводит меня к странице Oracle, которая просто повторяет сообщение (а не настолько полезна, чтобы фактически перечислять совместимые типы). Все учебники по Oracle сосредоточены на BLOB, ни один из примеров не относится к CLOB.
Самое близкое, что я нашел к ответу, было здесь, на переполнении стека (слава!). Этот вопрос: Выбор CLOB в Oracle с использованием C и встроенного SQL
был от кого-то еще с той же проблемой. Он утверждает, что решил эту проблему, удалив параметр CHAR_SET = STRING из вызова командной строки PRO-C. Проблема в том, что Pro-C здесь даже не распознает, что такая опция существует … поэтому я не могу удалить ее, потому что я ее не использую. (Я пытался указать на это, не понимая, что я неправильно использовал этот форум, и он был (справедливо) удален … мои извинения тому, кто должен был навести порядок.)
Моя версия Pro * C / C ++ — 11.2.0.1.0
Варианты, которые я использую:
PARSE=NONE CODE=CPP CPP_SUFFIX=cpp MODE=ORACLE LINES=YES THREADS=YES
И, как я упоминал ранее, точно то же самое (за исключением объявления OCIBlobLocator и переименования различных переменных из blob_something в clob_something, компилируется и функционирует.
К сожалению, я не могу опубликовать код, потому что он находится в системе с воздушным зазором, и разрешение на передачу файла потребовало бы иска от гораздо более высокого уровня, чем я.
Выяснил в чем проблема:
Я сделал
Буфер EXEC SQL VAR является RAW (BUFFSIZ);
что хорошо, когда буфер предназначен для взаимодействия с большим двоичным объектом, но не для сгустка. По-видимому, не имеет значения (много), как вы объявляете буфер, но вы не хотите делать его RAW с этим вызовом.
Между прочим, если вы объявляете «буфер» в одном методе, имеющем дело с BLOB, он все еще находится в области действия Pro-C в последующих методах, включая вызов IS RAW — поэтому мне пришлось использовать другое имя в последующем методе, который я написал для работы с CLOBs.
Других решений пока нет …