Типы буферов Pro-C, совместимые с CLOB

Я пытаюсь использовать 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, компилируется и функционирует.

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

1

Решение

Выяснил в чем проблема:

Я сделал

Буфер EXEC SQL VAR является RAW (BUFFSIZ);

что хорошо, когда буфер предназначен для взаимодействия с большим двоичным объектом, но не для сгустка. По-видимому, не имеет значения (много), как вы объявляете буфер, но вы не хотите делать его RAW с этим вызовом.

Между прочим, если вы объявляете «буфер» в одном методе, имеющем дело с BLOB, он все еще находится в области действия Pro-C в последующих методах, включая вызов IS RAW — поэтому мне пришлось использовать другое имя в последующем методе, который я написал для работы с CLOBs.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector